我有一个 WPF 容器应用程序(带有ContentControl
主机)和一个容器应用程序(UserControl
)。双方都对对方视而不见。
只有一个 XML 配置文件包含dllpath
容器的 DLL 字符串和容器ViewModelClass
内部的完整命名空间名称。
容器中的通用代码解析容器的程序集 ( Assembly.LoadFrom(dllpath)
) 并使用Activator.CreateInstance(vmType)
. 当它viewmodel
托管在ContentControl
容器内部时,并且相关的 vierwmodel 特定 ResourceDictionary 被添加到ContentControl.Resources.MergedDictionaries
容器的内容控件中,因此视图加载正常。
现在我的容器必须使用本地文件夹DataGrid
中的程序集引用来托管 WPF。WPFToolkit.dll
C:\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)。