WPF XAML引用未通过myAssembly.GetReferencedAssemblies()解析

时间:2012-10-15 09:19:37

标签: .net wpf .net-assembly

我有一个WPF容器应用程序(带有ContentControl主机)和一个容器应用程序(UserControl)。两者都彼此无视。

只有一个XML配置文件包含容器DLL的字符串dllpath和容器内ViewModelClass的完整命名空间名称。

容器中的通用代码解析容器的程序集(Assembly.LoadFrom(dllpath))并使用Activator.CreateInstance(vmType)创建viewmodel的实例。当此viewmodel托管在容器的ContentControl内,并且相关的vierwmodel特定ResourceDictionary被添加到容器的内容控件的ContentControl.Resources.MergedDictionaries时,因此视图加载正常。

现在,我的容器必须使用DataGrid文件夹中WPFToolkit.dll的程序集引用来托管WPF C:\Lib

WPFToolkit.dll复制本地引用已添加到容器项目的.csproj文件中,并且仅使用其XAML名称在UserControl.XAML中引用。这样,我的容器应用程序中的bin\debug文件夹就会复制WPFToolkit.dll

XAML:

xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" <Controls:DataGrid ItemsSource="{Binding AssetList}" ... />

问题: ViewModel(即容器的usercontrol)尝试加载自身的那一刻,我得到了这个错误。

“找不到类型'Microsoft.Windows.Controls.DataGrid'。编译时使用的程序集可能与加载时使用的程序集不同,但缺少类型。”

因此,我尝试在托管视图模型之前加载容器的程序集(myAssembly.GetReferencedAssemblies())的引用程序集。 WPFToolkit不在那个程序集列表中!

奇怪的是我在容器代码库中有另一个名为Logger.dll的dll,但是这个在后面使用C#代码实现。所以我在myAssembly.GetReferencedAssemblies()中正确地解析了它的引用。

这是否意味着GetReferencedAssemblies永远无法解析程序集的BAML引用?

修改

忘记添加我在容器中执行了一个post build事件到xcopy all bin\debug\*.*到容器的'bin \ debug'。它起作用了。但是我不希望所有的容器被这样复制到容器中。在运行时,容器应该忘记容器应用程序(甚至是dll)。

1 个答案:

答案 0 :(得分:0)

您的问题的解决方案可能是向AppDomain.AssemblyResolve事件添加处理程序。当需要程序集并且您的应用程序无法以常规方式找到时,此事件被称为最后的手段。在这里,您可以通过扫描容器文件夹(从配置中读取,因此没有硬关系)来尝试查找所需的dll来自定义此过程。