我有以下项目结构:
类库中有几个usercontrols,其中包含telerik组件。我有一个宿主应用程序,它从类库中托管这些用户控件。
现在问题是,尽管参考了库中的telerik dll,我仍然需要在我的宿主应用程序中引用telerik dll。否则它会在运行时抛出XamlParseException
。它编译时没有错误。
类型的第一次机会异常 ' System.Windows.Markup.XamlParseException'发生在 PresentationFramework.dll
其他信息:无法加载文件或程序集 ' Telerik.Windows.Controls.GridView,PublicKeyToken = 5803cfa389c90ce7' 或其中一个依赖项。系统找不到指定的文件。
为什么会这样?为什么需要重复dll。
我正在使用版本为2015.2.623.45
要重现此问题: 我们可以用一个usercontrol创建一个库
<UserControl>
<Grid>
<telerik:RadGridView></telerik:RadGridView>
</Grid>
</UserControl>
然后创建另一个引用此类库的项目
<Window>
<Grid>
<wpfApplication1:UserControl1/>
</Grid>
</Window>
尝试运行它。
(为简洁起见,我省略了xmlns定义)
答案 0 :(得分:5)
取自以下解决方案:
DLL reference not copying into project bin
A)添加对主机应用程序的引用
B)添加类库的虚拟代码,以便编译器检测到 正在使用引用,然后将其复制到Host Application Bin文件夹中。
C)添加构建事件以强制复制DLL。
只是让XAML代码不够的原因是编译器没有评估它以查看你的XAML所依赖的DLL。
我现在选择B,但我倾向于选择A)是最佳实践。
如果您在某个时刻开始在C#中操作telerik控件,一切都将按预期开始工作。
答案 1 :(得分:0)
在实际使用DLL的项目文件中,将其添加到<PropertyGroup>
部分:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
现在,DLL将被复制到该项目以及所有引用项目的输出文件夹中。