1

我有一个 WPF 容器应用程序(带有ContentControl主机)和一个容器应用程序(UserControl)。双方都对对方视而不见。

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

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

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

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

XAML:

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

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

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

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

奇怪的是,我Logger.dll在容器代码库中引用了另一个 dll,但这个 dll 是使用 C# 代码实现的。所以我在myAssembly.GetReferencedAssemblies().

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

编辑:

忘了添加我在containee 中做了一个post build 事件来xcopy allbin\debug\*.*到容器的'bin\debug'。然后就可以了。但我不希望所有容器都像那样复制到容器中。容器应该在运行前忽略被包含的应用程序(甚至是 dll)。

4

1 回答 1

0

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

于 2012-10-15T11:42:52.493 回答