我有一个 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)。