我已将一个项目(自定义WPF控件)编译到dll中,并将该dll作为参考附加到我的主项目中,计划在那里使用该自定义控件。
dll项目本身引用了其他dll,如System.Reactive.Linq和许多其他dll。我看到没有遗漏的参考资料。主要项目没有直接引用所有这些dll。
当我尝试在主项目XAML中使用自定义控件时,它会抱怨无法加载程序集:
<myControls:MyCustomControl> />
我认为在将自定义控件项目编译成dll后,我不需要在主项目中关注它使用的引用了什么。是对的吗?或者在这种情况下我是否必须在主项目中引用System.Reactive.Linq?
答案 0 :(得分:1)
如果装配体依赖外部装配体,则绝对需要包含外部装配体。
考虑一下......假设你有一个利用Log4Net的Logging程序集。如果使用Logging程序集,那么您是否还需要Log4Net程序集?如果你没有,那就缺少一项要求。
寻找&#34;依赖&#34;的最佳方式程序集是检查bin文件夹中它们构建的位置。例如,我在上面列出的内容,在大多数情况下,Logging程序集应该将Log4Net程序集复制到其bin中。 GAC中的任何内容,虽然不会被复制(可能是好的或坏的),除非根据我的知识标记为这样做。
另一种思考方式是......假设您需要翻译(汇编) - 您的主要语言是英语(也是汇编要求)。你需要一个能说俄语的人(同样是一个集会)。译者必须有俄语的要求,或者他们怎么说俄语呢?所以他们依赖俄语,就像他们依赖于能够讲俄语的人一样。也许不是最好的例子,但希望它足够有意义。
答案 1 :(得分:0)
让我试着把这一切都放在一起。 首先,这个问题与WPF无关,这是一个更普遍的问题。在我看来,我们应该讨论解决运行时和运行时间问题。编译时依赖。
如果是运行时依赖项,则所有必需的程序集都基于Standard Search Order for Desktop Applications定位。如果搜索不成功,您将获得如上所述的异常。
至于编译时依赖性,有些情况下,编译器返回错误的原因并不明显。请考虑以下带有2个项目的示例:
项目#1:具有自定义WPF UserControl的类库 - &gt;
public partial class UserControl10 : UserControl, IClientChannel
{
//System.ServiceModel.IClientChannel from System.ServiceModel.dll
//basic implementation of IClientChannel comes here
}
.xaml部分无关紧要。对此项目添加了对System.ServiceModel.dll的引用。
项目#2:引用项目#1的WPF应用程序 - &gt;
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:class1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<class1:UserControl10 x:Name="t"/>
</Grid>
</Window>
尝试构建它,并猜测:您收到编译时错误,指出您需要添加对System.ServiceMode.dll的引用。删除x:名称=&#34; t&#34;消除了这个问题。为什么?由于自动创建* .g。[i。] cs文件。在其中,您将找到类型为UserControl10的内部数据成员定义。但是,此类型具有IClientChannel的依赖关系,它位于System.ServiceModel.dll中。
如果您尝试在项目#2中的代码隐藏中的任何位置使用类型UserControl10,那么同样的错误会在您的脸上出现。
希望我能提供帮助。