구성 요소에 URI로 식별되는 리소스가 없습니다.
모든 보기/사용자 컨트롤에 사용할 일반 데이터 그리드를 만들고자 합니다.
제 구조는 다음과 같습니다.
Class Library
라고 하는"Core"
:
Class
라고 하는"ViewBase"
:
public class ViewBase : UserControl
{
public ViewBase()
{
}
//Rest of Methods and Properties
}
Class Library
라고 하는"Controls"
:
UserControl
라고 합니다."GridView"
:
XAML:
<vb:ViewBase x:Class="Controls.GridView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vb="clr-namespace:Core;assembly=Core">
<Grid>
<DataGrid></DataGrid>
</Grid>
</vb:ViewBase>
코드 이면:
using Core;
public partial class GridView : ViewBase
{
public GridView ()
{
InitializeComponent();
}
}
그런 다음 WPF 애플리케이션은 "WPFApp"입니다.
Class
라고 하는"View"
:
using Controls;
public class View : GridView
{
public View()
{
InitializeComponent();
}
}
나의 모든 아이디어는 사용하는 것입니다.GridView
가 가내필요곳에한이 곳.DataGrid
.
응용 프로그램을 실행할 때 다음 오류가 발생합니다.
"The component 'WpfApp.View' does not have a resource identified by the URI '/Controls;component/GridView.xaml'."
내가 뭘 잘못하고 있는 거지?
이것이 올바른 접근 방식입니까, 아니면 제가 너무 멀리 갔습니까?
실망스럽게도, 저는 정확히 이 오류를 가지고 있었고 원인을 알아내기 위해 평생을 보냈습니다.저에게 있어서, 그것은 한때 작동했지만, 파생된 컨트롤의 XAML에 약간의 사소한 변경을 가했고, 컴파일러는 그 오류 메시지를 주기 시작했습니다.짧은 해결책, 해결하기 위해 많은 시간을 들이는 것을 중단하는 것: Visual Studio를 종료하고 다시 열어서 다시 컴파일하고 마법처럼 문제가 사라졌습니다! (이것은 VS2012 Pro입니다) 누구나 코드에 존재하지 않는 문제를 찾기 위해 순환하는 경우에 대비하여 추가한 것입니다.먼저 "IT 크라우드 솔루션"을 시도해 볼 가치가 있습니다.
이것은 저에게 3일 동안 두통을 주었습니다!클래스 라이브러리에 XAML UserControl이 있고 .exe 프로젝트의 UserControl에서 파생된 클래스(C#만)가 있습니다.My MainWindow.xaml의 xaml designer에서 응용 프로그램을 시작할 때 "구성 요소에 uri로 식별된 리소스가 없습니다."라는 오류가 발생했습니다."Juan Carlos Girón"의 대답은 마침내 저를 해결책으로 이끌었습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Reflection;
using System.IO.Packaging;
using System.Windows.Markup;
namespace ClassLibrary1
{
static class Extension
{
public static void LoadViewFromUri(this UserControl userControl, string baseUri)
{
try
{
var resourceLocater = new Uri(baseUri, UriKind.Relative);
var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
var stream = exprCa.GetStream();
var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
var parserContext = new ParserContext
{
BaseUri = uri
};
typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, userControl, true });
}
catch (Exception)
{
//log
}
}
}
}
UserControl의 .cs 파일로 호출했습니다.
namespace ClassLibrary1
{
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
//InitializeComponent();
this.LoadViewFromUri("/ClassLibrary1;component/myusercontrol.xaml");
}
}
}
"후안 카를로스 기론"에게 다시 한번 감사드립니다!
이 오류가 발생하는 이유는 VS 2010에서 구현된 InitializeComponent가 파생 클래스의 어셈블리에서 항상 검색되기 때문입니다.
구성 요소 초기화:
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/WpfApplication1;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
XAML 리소스를 조회하는 줄은 System입니다.창문들.어플.구성 요소(이 이름은 resourceLocator)를 로드합니다.그리고 이것은 아마도 '이것'과 동등하기 때문에 실패할 것입니다.GetType().Assembly'는 상대 URI로 식별된 리소스를 검색할 어셈블리를 결정하는 데 사용됩니다.그리고 '이거.GetType()'은(는) 코드가 구현된 클래스의 유형이 아닌 파생된 개체의 유형을 가져옵니다.
PS. 이거 버그야?모르겠어요...
당신은 이 접근법을 시도할 수 있습니다.
나는 나만의 것을 만들었습니다.InitializeComponent()
그리고 나는 이쪽으로 전화를 걸었습니다.
this.LoadViewFromUri("/NameOfProject;component/mainwindow.xaml");
public static void LoadViewFromUri(this Window window, string baseUri)
{
try
{
var resourceLocater = new Uri(baseUri, UriKind.Relative);
var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
var stream = exprCa.GetStream();
var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
var parserContext = new ParserContext
{
BaseUri = uri
};
typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, window, true });
}
catch (Exception)
{
//log
}
}
저는 같은 결과로 아주 비슷한 일을 하고 있었습니다.UsageControl이라는 WPF 컨트롤이 포함된 C# 클래스 라이브러리(xaml과 함께 제공되는 xaml.cs 파일)가 하나 있었습니다.별도의 C# 프로젝트(즉, 별도의 dll)에서 UsageControl에서 상속받았지만 자체 스핀을 적용한 C# 클래스 CPUUsageControl을 만들었습니다.내 뷰 중 하나에서 CPU 사용률 제어를 사용하려고 했을 때 당신과 동일한 오류가 발생했습니다.
이 문제를 해결하기 위해 저는 별도의 어셈블리에서 기본 컨트롤에서 상속되는 클래스를 만드는 대신 기본 컨트롤을 포함하는 새로운 WPF 컨트롤을 만들었습니다.그런 다음 CpuUsage 클래스에 포함된 모든 논리를 WpfCpuUsageControl의 코드 뒤에 넣습니다.저는 이 물체를 사용할 수 있었습니다. 다른 컨트롤들도 모두 정상입니다.
컨트롤 "GridView"의 경우 새 WPF 사용자 컨트롤을 만들고 이 컨트롤을 GridView라고 하며 그리드 컨트롤의 내용으로 "ViewBase"를 포함하도록 합니다.DataGrid에 저장된 ViewBase 콘텐츠 내부에는 다음과 같은 내용이 있습니다.
<UserControl....>
<Grid>
<ViewBase name="vBase">
<DataGrid name="dGrid" />
</ViewBase>
</Grid>
</UserControl>
또한 사용자 컨트롤에서 직접 상속하기 위해 ViewBase가 필요하다는 것은 분명하지 않습니다.컨트롤이 특정 속성과 메서드를 갖는 것만 원하는 경우에는 BaseControl 클래스(개체를 제외한 다른 사용자로부터 상속되지 않음)를 만들고 이후 컨트롤이 이 클래스에서 상속되도록 하는 것이 좋습니다.아마도 추상적인 기본 클래스 또는 인터페이스를 찾고 있을 것입니다.
MVVM WPF 프로젝트의 경우 일반적으로 INOTIFY를 구현하는 BaseView 모델이 있습니다.속성이 변경되어 모든 곳에서 동일한 코드를 수행할 필요가 없습니다.
행운을 빕니다, 이 문제가 해결해야 할 큰 고통이었다는 것을 압니다.예외 메시지와 구글은 가장 도움이 되지 않습니다!
여기도 같은 문제입니다.
짧은 버전:
로컬 복사를 거짓으로 설정해야 합니다!
긴 버전:
우리는 WPF 솔루션(MVVM, 20개 프로젝트)을 개발하고 플러그인 시스템을 구현했습니다./bin/Debug 디렉토리에는 실행 파일, 일부 dll 파일 및 플러그인이 포함된 플러그인 디렉토리가 포함되어 있습니다.창(뷰), View Model, Model 및 일부 인터페이스를 정의하는 프로젝트 "DialogLib"(클래스 라이브러리, 대화 상자 종류)가 하나 있습니다.플러그인 중 하나가 DialogLib의 인터페이스 중 하나를 사용했습니다.창 자체는 기본 응용 프로그램에 의해 열립니다.
플러그인에서 'DialogLib' 라이브러리의 인터페이스를 사용하려면 플러그인 프로젝트 참조에 DialogLib의 프로젝트 참조를 추가해야 했습니다.응용 프로그램이 시작될 때 플러그인이 로드되었습니다.그런 다음 사용자가 메뉴 항목을 선택하면 창이 열립니다.이 시점에서 "...구성 요소에 URI로 식별된 리소스가 없습니다..." 오류가 발생했습니다. 이 오류는 뒤에 있는 윈도우즈 코드가 구성 요소 초기화()를 실행하려고 할 때 발생했습니다.
어디가 문제야?
문제는 솔루션을 구축할 때 VS가 DialogLib.dll을 올바르게 생성하여 /bin/Debug/에 복사했다는 것입니다.이는 기본 응용프로그램 파일이 창을 열기를 원하기 때문입니다.그러나 플러그인 중 하나가 DialogLib.dll에 정의된 인터페이스 중 하나를 사용하기 위해 참조했기 때문에 DialogLib.dll도 /bin/Debug/plugins에 복사되었습니다.그래서 어쩌라고
런타임에 플러그인이 로드되면 플러그인은 /bin/Debug/plugins/DialogLib.dll에 정의된 인터페이스를 사용하고 기본 애플리케이션 파일은 /bin/Debug/DialogLib.dll에 정의된 창을 열려고 시도합니다.파일은 동일하지만 VS에 문제가 발생합니다.플러그인 참조의 DialogLib 참조 속성에 대한 CopyLocal 값을 설정하면 DialogLib.dll이 /bin/Debug/plugins에 복사되지 않으므로 문제가 해결됩니다.
dll 파일, 플러그인 및 메인 애플리케이션에 정의된 유형 A를 사용하고자 하는 다른 프로젝트에서도 유사한 문제(그러나 다른 오류)가 발생했습니다.로컬 복사가 true로 설정되어 dll 파일의 복사본이 ../bin/Debug/plugins 및 ../bin/Debug/에 위치하게 되었습니다.동일한 dll 파일임에도 불구하고 메인 앱 파일의 Type A와 플러그인의 Type A는 교환할 수 없는 유형으로 처리된 것으로 나타났습니다.
- 제
obj
folder - 제
bin
folder - 솔루션 재구성
날 위해 일했다!
또다음사용어여로경를드우는하를 사용하여 를 로드하는 경우에도 입니다.Assembly.LoadFile
확인해 보세요.AppDomain.CurrentDomain.GetAssemblies()
현재 AppDomain에 있는 중복 어셈블리의 경우. 요소가 URI를 되기 때문입니다.WPF UserControl은 URI로 로드됩니다.또한 현재 AppDomain에 중복 어셈블리가 있기 때문에 애플리케이션은 어떤 어셈블리를 사용해야 할지 알 수 없습니다.
나는 이것을 배치함으로써 해결했습니다.
myusercontrol = Activator.CreateInstance<myusercontrol>();
에서 사용자 컨트롤 앞에 .InitializeComponent();
선
Visual Studio 2013을 사용할 때 동일한 오류가 발생했습니다.
구성 요소에 URI로 식별되는 리소스가 없습니다.
솔루션을 청소하고 재구축하는 중 - 작동하지 않았습니다.
Visual Studio를 닫고 여는 중 - 작동하지 않았습니다.
솔루션:
했습니다.bin
디렉토리를 지정하고 모든 파일을(를) 지웠습니다.
프로젝트를 다시 실행하고 잘 작동했습니다.
솔루션의 루트 디렉터리에서 열리는 패키지 관리자 콘솔을 열고 다음 powershell 명령을 실행합니다.
Get-ChildItem -inc bin,obj -recurse | Remove-Item -recurse -force -EA SilentlyContinue
@윌럼, 저한테는 완벽하게 괜찮은 것 같아요.사실 저는 이것을 시도했고 제 경우에는 효과가 있었습니다.저는 용한사를 요.ListBox
에 DataGrid
(하지만 그것은 중요하지 않습니다).
제 모든 네임스페이스가 한 어셈블리에 있었습니다.그래서 모든 예를 들어 공통 부모 네임스페이스를 사용했습니다.
MyWpfApplication.Controls
MyWpfApplciation.GridView
MyWpfApplciation.ViewBase
을.Controls
,GridView
,ViewBase
기존의 존기시충니다합과 하고 있습니다.System
또는System.Windows.Controls
기본 네임스페이스 및 클래스 선언입니다.그래서 저는 제가 정확한 것들을 참조했는지 확인했습니다.MyWpfApplication.*
내 프로젝트에서.
저는 상속 문제 없이 이 문제에 부딪혔을 뿐입니다.대화 상자가 포함된 DLL을 참조하여 해당 대화 상자를 만들고 표시하려고 했습니다.특정 폴더에서 어셈블리를 로드하는 어셈블리 리졸바가 있는데 VS에 참조를 추가하고 로컬 복사를 끄지 않은 것으로 나타났습니다.간단히 말해서, 제 프로세스는 동일한 DLL의 두 버전을 로드했습니다.이것은 WPF(또는 런타임)를 혼동하는 것처럼 보입니다.로컬 복사를 지우고 추가 DLL 복사본을 삭제하면 다시 정상적으로 작동합니다.
xaml 파일 이름을 변경한 후 이 오류가 발생했습니다.이름 변경을 반대로 하면 문제가 해결됩니다.
또한 App.xaml의 xaml 파일 이름에 대한 참조가 업데이트되지 않았지만(StartupUri) 현재 이름으로 이름을 바꾼다고 문제가 해결되지는 않았습니다.기본적으로 xaml 파일의 이름을 바꿀 수 없습니다.
참고로, 저는 오류에서 '불만'을 나타내는 구성 요소가 스플릿콤보박스였습니다.
동일한 프로젝트를 두 개의 솔루션으로 열었을 때 발생합니다.한 프로젝트에서 기본 컨트롤을 수정하면 다른 프로젝트에서 이 문제가 발생합니다.닫기 및 열기가 작동하지 않으면 "C:"의 모든 폴더를 삭제합니다.\사용자...\AppData\Local\Microsoft\VisualStudio\12.0\디자이너\섀도 캐시"
창을 닫았다가 다시 열 때도 이 문제가 발생할 수 있습니다.따라서 패키지 및/또는 dll과도 관련이 없을 수 있습니다.
IMHO가 과소평가한 PainElemental에서 게시한 솔루션 덕분에 문제를 해결했습니다.
namespace MyNamespace
{
public partial class MyDialog : Window
{
public MyDialog(ExcelReference sheetReference)
{
this.LoadViewFromUri("/MyApp;component/mynamespace/mydialog.xaml");
}
}
}
LoadViewFromUri는 PainElemental 작성한럼장확으현구됩니로다처이것▁load▁pain됩니구현다fromview로는.가장 미친 것은 같은 프로젝트에서 다른 창도 문제없이 작성했다는 것입니다.
Pain Elemental 감사합니다, 당신은 제 오랜 고통을 끝내줬어요!
다른 시스템에서 작동 중인 설치된 제품에서 특정 메뉴 선택 항목을 클릭하면 "구성 요소에 uri로 식별된 리소스가 없습니다" 오류가 지속적으로 표시되기 시작했습니다.제품을 제거하고, 파일이 정말 없어졌는지 확인하고, 다시 부팅하고, 제품을 다시 설치했습니다.문제는 남아 있었습니다.%TEMP% 디렉터리의 내용을 삭제하고 문제를 해결했습니다.
이 스레드의 모든 팁에 감사드립니다.제가 이 오류를 수정한 이유가 다시 약간 다른 것 같아요, 도움이 될 경우를 대비해 여기에 글을 올리겠습니다.
내 상황에서는 창을 호출할 때 오류가 발생했습니다.ShowDialog().좀 더 구체적으로 말하면, 내 창은 별도의 클래스 라이브러리 어셈블리에 정의되어 있습니다(어셈블리 A.dll이라고 부릅니다).
저는 다양한 제품에 사용되는 A 어셈블리의 여러 버전을 가지고 있는데, 그 중 일부는 플러그인이고 일부는 그렇지 않습니다.간단히 말해서, 그 결과 프로세스는 여러 가지 강력한 이름의 어셈블리 A 버전을 로드할 수 있습니다.따라서 @VahidN이 지적한 바와 같이 앱 도메인에 중복 어셈블리가 있지만, 그것들은 그곳에 있어야 하고 단지 동일한 어셈블리를 공유해야 하는 엄격하게 다른 버전의 어셈블리입니다.짧은 이름.
구성 요소 초기화()에 대한 WPF의 자동 생성 코드는 다음과 같습니다.
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/AssemblyA;component/forms/mywindow.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Forms\MyWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
이는 어셈블리 A의 짧은 이름만 참조하고, InitializeComponent() 메서드가 실행 중인 어셈블리 A의 특정 버전 또는 공개 키 토큰은 참조하지 않습니다.그 결과 코드는 프로세스에 로드된 첫 번째 AssemblyA 어셈블리를 찾은 것처럼 보이고 XAML을 검색한 다음(이전 버전의 어셈블리를 먼저 찾았기 때문에) 찾을 수 없습니다. 그런 다음 예외를 던집니다.또는 무언가를 찾을 수도 있지만, 우연히 로드된 어셈블리의 이전 버전 또는 최신 버전에서 원래 가지고 있던 것과 다른 XAML 리소스를 가져올 수도 있습니다.
완벽하지는 않지만 Pack URI 사양을 참조하고 단순히 어셈블리가 아닌 적절한 버전과 공개 키 토큰으로 어셈블리를 찾을 수 있도록 하는 나만의 확장 방법을 작성하여 이 문제를 해결했습니다.짧은 이름.
다른 사람들에게 도움이 될 경우를 대비해서, 여기 제가 만든 것의 단순화된 버전이 있습니다.
public static void AssemblySensitive_InitializeComponent(this ContentControl contentControl, string componentString)
{
// Strictly speaking this check from the generated code should also be
// implemented, but it doesn't fit directly into an extension method.
//if (_contentLoaded)
//{
// return;
//}
//_contentLoaded = true;
var asm = System.Reflection.Assembly.GetExecutingAssembly();
var shortName = asm.GetName().Name;
var publicKeyToken = GetPublicKeyTokenFromAssembly(asm);
var version = asm.GetName().Version.ToString();
System.Uri resourceLocater = new System.Uri($"/{shortName};V{version};{publicKeyToken};{componentString}", System.UriKind.Relative);
System.Windows.Application.LoadComponent(contentControl, resourceLocater);
}
/// <summary>
/// Gets a public key token from a provided assembly, and returns it as a string.
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
/// <remarks>Adapted from https://stackoverflow.com/questions/3045033/getting-the-publickeytoken-of-net-assemblies</remarks>
private static string GetPublicKeyTokenFromAssembly(System.Reflection.Assembly assembly)
{
var bytes = assembly.GetName().GetPublicKeyToken();
if (bytes == null || bytes.Length == 0)
return "None";
var publicKeyToken = string.Empty;
for (int i = 0; i < bytes.GetLength(0); i++)
publicKeyToken += string.Format("{0:x2}", bytes[i]);
return publicKeyToken;
}
_contentLoaded 비트는 아마도 확장 속성으로 수행될 수 있지만 C# 7.3에서 컴파일할 이 라이브러리의 코드가 필요하므로 주의를 분산시키지 않기 위해 제거한 훨씬 더 긴 해결 방법이 있습니다.
그런 다음 생성자로부터 다음과 같이 부릅니다.
public MyWindow()
{
// Don't use the auto-generated initialize, because if multiple different versions
// are loaded into the process, it can try to load the resource from the wrong one.
//InitializeComponent();
AssemblySensitive_InitializeComponent("component/forms/mywindow.xaml");
// ... do more constructor stuff ...
}
저는 무슨 일이 일어나고 있는지 알아내기 위해 좌절하는 데 많은 시간을 보냈습니다. 그래서 저는 이것이 저 밖에 있는 다른 누군가에게 도움이 되기를 바랍니다.
다른 사람들이 답변에서 지적했듯이, 연결된 XAML 리소스가 있는 기본 제어 클래스가 있는 경우 기본 제어에서 상속되는 클래스를 별도의 어셈블리에 정의하면 이 문제가 발생합니다.이 문제는 WPF의 제한 때문에 발생합니다.
WPF는 이제 오픈 소스이므로, 당신은 우리가 해결해야 하는 소스 코드를 볼 수 있습니다.IntializeComponent()
(따라가기가 좀 어렵긴 하지만).요약하면, 이 방법은 컨트롤의 XAML 리소스에 대한 스트림을 가져온 다음 로드합니다.XamlReader.LoadBaml()
이 문제는 파생 클래스가 XAML 리소스 파일과 다른 어셈블리에 있을 때 프레임워크 코드가 XAML 리소스 파일을 올바르게 로드하지 않는다는 것입니다.
XAML 리소스 스트림을 호출해야 .XamlReader.LoadBaml()
수동으로여기에 이미 정확하게 이를 수행하는 몇 가지 다른 답이 있습니다. 하지만 제 생각은 이렇습니다.다음의 내선 방식은 다른 답변보다 조금 더 간결하고, 반성을 통해 하나의 개인적인 방법에만 액세스하고, 또한 여러 통화로부터 보호합니다.
private static MethodInfo? _loadBamlMethod;
public static void InitializeComponent(this ContentControl control, string xamlResourceUri, ref bool contentLoaded)
{
// Ensure the control is only initialized once
if (contentLoaded) return;
contentLoaded = true;
// Use reflection to get the private XamlReader.LoadBaml() method and cache the result
_loadBamlMethod ??= typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static)
?? throw new InvalidOperationException("Could not find XamlReader.LoadBaml() via reflection");
// Load the XAML resource for the control
var stream = Application.GetResourceStream(new Uri(xamlResourceUri, UriKind.Relative)).Stream;
var parserContext = new ParserContext { BaseUri = PackUriHelper.Create(new Uri("application://")) };
_loadBamlMethod.Invoke(null, new object[] { stream, parserContext, control, true });
}
그러면 이렇게 사용할 수 있습니다.이제 다른 어셈블리의 컨트롤을 상속할 수 있습니다.BaseControl
이 문제를 볼 수 없습니다.
public partial class BaseControl : UserControl
{
protected BaseControl()
{
// The resource URI here can be coped from the generated partial class
// Note that we are also re-using the _contentLoaded field defined in the generated partial class
this.InitializeComponent("/Senti.Common.PrismModules.Hmi;component/controls/basecontrol.xaml", ref _contentLoaded);
}
}
WPF 프레임워크 내의 개인적인 방법에 액세스함으로써 이 해결 방법(및 다른 답변의 방법)이 작동하며, 이는 분명히 지원되는 사용 사례가 아닙니다.즉, 저는 WPF의 .NET 5 버전을 사용하여 이 접근 방식을 개발하고 테스트했지만 아무런 문제가 발견되지 않았습니다.Microsoft는 또한 버그 수정 등을 제외하고 WPF 프레임워크에 대해 거의 개발이 계획되어 있지 않으므로 이 해결 방법은 상당히 안정적일 것이라고 말했습니다.
Visual Studio를 모두 닫는 것보다 작업 관리자에서 XDescProc.exe를 제거하는 것이 더 빠릅니다.
XDescProc가 설계자입니다.프로세스가 닫히는 순간 비주얼 스튜디오에서 디자이너 다시 로드 링크가 표시됩니다.이 옵션을 클릭하면 XDes가 다시 시작되고 '리소스 없음' 오류가 사라집니다.
디자이너 프로세스를 종료한 후 표시되는 비주얼 스튜디오의 링크는 다음과 같습니다.
이름 바꾸기/복사 작업을 통해 실수로 사용자 컨트롤을 삭제했습니다.제가 버전 컨트롤에서 프로젝트 파일과 xaml 파일 및 .cs를 복원했을 때 이 오류가 디자인 스튜디오에서 실수로 삭제/이름 변경된 컨트롤에 대해 발생하기 시작했습니다.
Studio를 문의제유있형시를 합니다. 그래서 Visual Studio를 닫고 삭제합니다.bin
디렉터리 및 재구성 작업이 완료되었습니다.
PainElemental의 솔루션(그의 코드에 대한 ClassLibrary1은 .dll 확장자 없이 .dll 이름임을 명확히 하기 위해)을 따라 특정 오류 메시지를 문제에 연결하는 데 도움이 되는 경우를 대비하여 다음 시나리오를 사용합니다.
DLL을 사용하여 사용자 컨트롤을 기본 프로그램에 자체 팝업 창으로 로드하고 실행합니다.PainElemental의 솔루션은 대부분 작동했지만 "popup.dll"의 3개 클래스 중 1개가 제대로 로드되지 않았습니다.다음과 같은 두 가지 내부 예외가 있는 예외를 얻을 수 있습니다.
mscorlib 파일 이름...;
WpfXamlLoader.로드...값을 제공합니다.정적 리소스 확장...;
BamlType 확인... 메서드 또는 작업이 구현되지 않았습니다.
저의 경우, 새로운 URI를 로드하고 테스트에서 작동하는 것을 확인했지만, Live 환경에서 실행하려고 하면 LoadViewFromUri()에서 오류가 발생합니다.
테스트를 더 진행하면서 사용 중인 별도의 "library.dll" 파일을 로드할 수 없는 문제로 범위를 좁혔는데, 사용 중인 Converter가 실패한 클래스의 .xaml 파일에 포함되어 있었습니다. 추가 연구 결과 Live 환경이 다른 "library"를 사용하고 있다는 문제가 있었습니다."popup.dll"에서 예외 메시지가 표시되지 않았음에도 불구하고 테스트 환경에서 사용하던 버전보다 dll" 버전이 더 많습니다.
참고로 Copy Local=을 사용합니다.사실이고 그것은 저에게 문제가 되지 않았습니다.이러한 문제를 가장 잘 디버그하려면 .dll 파일이 .exe에 의해 검색되는 위치를 이해하는 것이 좋습니다.VS에서 프로젝트를 실행할 때 로컬= 복사를 수행하는 것으로 알고 있습니다.빌드할 때 .dll은 .exe와 동일한 폴더에 복사됩니다..exe를 실행하면 .dlls가 .exe와 동일한 폴더에서 표준 위치를 검색합니다..exe가 .dll을 찾을 수 있는 추가 위치는 프로빙 요소의 .exe.config 파일에서 설정할 수 있습니다.아래 예제에서는 .exe의 위치를 기준으로 'MyDLS' 및 'MyDLS\Core' 디렉터리를 검색할 수도 있습니다.하위 폴더는 자연스럽게 검색되지 않으므로 명시적으로 지정해야 합니다.나는 그것이 GAC도 검색한다고 생각하지만, 나는 현재 GAC에 대한 최소한의 지식을 가지고 있습니다.
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="MyDLLs;MyDLLs\Core;"/>
</assemblyBinding>
</runtime>
</configuration>
안녕하세요 이 문제를 해결하는 방법은 xaml 사용자 컨트롤의 이름을 초기화 구성 요소()의 모든 작은 캡으로 변경하는 것이었습니다.
창 대화상자(창)를 시작하려고 할 때 사용합니다.시작하는 동안 응용 프로그램에서 ShowDialog()가 발생하여 창의 클래스 생성자에 있는 InitializeComponent 메서드에서 예외가 발생했습니다.머리를 많이 긁은 후에 저는 애플리케이션 exe만 포함된 디버그 디렉토리에 app.publish 폴더가 생성되는 것이 문제라는 것을 발견했습니다.app.publish 폴더를 삭제하면 이 예외가 해결되었습니다.이 폴더를 만들지 않으려면 다음 문서를 참조하십시오.비주얼 스튜디오 2013에서 "app.publish" 디렉터리를 만드는 것은 무엇입니까?
언급URL : https://stackoverflow.com/questions/7646331/the-component-does-not-have-a-resource-identified-by-the-uri
'source' 카테고리의 다른 글
왜 '없음'을 선택합니까?__eq__("a")'가 참으로 평가되는 것 같습니까(그러나 완전히는 아닙니다)? (0) | 2023.05.22 |
---|---|
WPF: 창이 포커스를 잃었을 때 탐지 (0) | 2023.05.22 |
결과를 제한하기 전에 Mongo에게 컬렉션을 정렬하라고 어떻게 말합니까? (0) | 2023.05.22 |
스팸으로 거부되는 그리드 전자 메일 보내기 (0) | 2023.05.22 |
$빈 배열 찾기 (0) | 2023.05.22 |