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