当前位置: 首页 > 编程语言 > C#

为什么要引用一个不直接使用的dll?分享

时间:2023-04-11 00:00:07 C#

为什么我需要引用一个我不直接使用的dll?我有从外部开发人员那里收到的源代码,这些代码分为4种类型的项目:他们的框架、我的项目环境(我们称之为“ENV”)、应用程序库(称之为“Base”)和应用程序本身(大约20dll,我将统称为“App”)。现在,我在这个混乱中添加了另一层,一个名为AdvanceFeatures的dll。它就在ENV(框架顶部)下方。此dll仅引用框架,ENV引用它。只有ENV使用这个AdvanceFeaturesdll,而Base和App只使用ENV。我在这里的工作方式是App中的大多数对象都在Base中定义,并在ENV中继承/实现类/接口。这些对象中的一小部分(在App和Base中)从框架本身继承/实现类/接口(但这种情况很少见)。到目前为止一切顺利,除了一个事实。编译器要求我从App和Base中的每个dll添加对AdvanceFeaturesdll的引用。我没有在ENV之外使用AdvanceFeatures,那么为什么我需要这些参考?编辑:我已经为这个问题创建了一个演示项目。这是项目细节:Assembly:AdvanceFeaturesReferences:Nothing(Referenceproject-folderisempty)无效装饰();}}IEnvClass内容:namespaceAdvanceFeatures{publicinterfaceIEnvClass{stringName{get;放;}}}装饰器内容:命名空间AdvanceFeatures{publicclassDecorator:IDecorator{publicDecorator(IEnvClassdecorated){Decorated=decorated;}#regionIDecorator的实现publicIEnvClassDecorated{get;放;}publicvoidDecorate(){Decorated.Name="NewName";}#endregion}}Assembly:ENVReferences:AdvanceFeatures(CompiledDLL)ContentsofonlyclassSomeEnvClass:namespaceENV{publicclassSomeEnvClass:AdvanceFeatures.IEnvClass{publicstringName{get;放;}privatereadonlyAdvanceFeatures.IDecorator_decorator;公共SomeEnvClass(字符串名称){Na我=名字;_decorator=newAdvanceFeatures.Decorator(this);_decorator.Decorate();}publicstringFoo(){返回名称;}}Assembly:TestBaseReferences:ENV(compiledDLL)ContentsofonlyclassSomeEnvExtendingClass:namespaceTestBase{publicclassSomeEnvExtendingClass:ENV.SomeEnvClass{publicSomeEnvExtendingClass(stringname):base(name){}}}我得到错误:错误1??类型“AdvanceFeatures.IEnvClass”在未引用的程序集中定义您必须添加对程序集“AdvanceFeatures,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用。E:ProjectsDevTestReferenceInheritanceTestBaseSomeEnvExtendingClass.cs318TestBase现在,我知道为什么DLL必须对已编译的可执行文件可用,但为什么开发人员应该了解ENV的内部工作原理(更具体地说,它是继承树)以扩展它?我阅读了所有的答案和评论,所以我想出了这个例子。也许更容易理解。?Interfaces.dll公共接口DoesntAcceptValidAndAccurateAnswersOrComments{boolImAlwaysRight();classStackOverflowDotCom{publicstaticvoidMain(){NeowizardsomeGuy=newNeowizard();//CS0012一些家伙。我一直都是对的();}}这是编译器相关的。当它尝试编译Program.exe时,它??会看到一个Newizard类型的对象。它还看到它实现了一个名为DoesntAcceptValidAndAccurateAnswersOrComments的接口,但是没有对Interfaces.dll的引用,它找不到它,所以它无法编译,因为它是一个接口,就编译器而言,不会存在于程序中。可执行程序。因为Program.exe使用Neowizard,它还必须使用Newizard派生的任何东西,这恰好是接口。这不仅仅适用于接口,它与封装无关。这是C#编程语言的规则,由编译器强制执行。如果您想证明更多,那么您应该多询问C#编译器团队的人员,但是当他们的答案实际上非常准确且受过良好教育时,请不要试图帮助您解决问题的每一点。个人回答。.如果你在一个程序集publicclassBar{...}和另一个publicclassFoo{publicBarMyBar{get;set;}}和第三个publicclassFooBar{publicFoo{get;set;}}那么你可以这样写:BarmyBar=newFooBar().Foo.MyBar;如果你没有告诉编译器关于bar的定义,最后一行代码怎么能被编译呢?或者更直接地回答你的问题。当使用引用另一个程序集的程序集时,您的代码可能会直接使用来自另一个程序集的东西。例如,如果在另一个程序集中声明了返回类型,或者如果在另一个程序集中使用了在另一个程序集中定义的类型的对象,则在直接引用的程序集中实现间接方法或私有字段。编译器需要了解这些类型才能完成其工作。它依赖于您告诉它在哪里可以找到这些类型的信息。即添加参考编辑只是为了澄清,没有规则要求您引用与您正在使用的相同的dll。您必须引用一个表示相同的dll。这就是您可以签署DLL的原因。然后你保证它总是相同的实现(或者至少某些人访问了密钥)但是,使用不同程序集的可能性迫使dll/程序在中间使用dll。您需要明确声明要使用给定程序集的哪个实现。基本有两种可能:以上是C#学习教程:为什么要引用一个不直接使用的dll?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——你可以在不知不觉中使用部分AdvanceFeatures库,例如,在某个时候获取对从AdvanceFeatures类继承的类的引用。该类可能很小,您可能在AdvanceFeatures中有一个枚举,可以通过ENV中的方法返回。你还没有做这样的事情,只是图书馆仍然需要在那里。除非将AdvanceFeaturedll嵌入到ENV中,否则实际上不能在没有AdvanceFeature的情况下使用ENV。通常这意味着它需要与您的可执行文件位于同一文件夹中。可能值得检查库是否设置为在其属性中复制本地等,或者对其属性的引用。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: