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

为什么我(有时)必须引用我引用的程序集所引用的程序集?

时间:2023-04-10 22:15:48 C#

为什么我(有时)必须引用我引用的程序集引用的程序集?我有一个程序集A,它定义了一些带有一些重载的接口:publicinterfaceITransform{PointInverseTransform(Pointpoint);矩形逆变换(矩形值);System.Drawing.PointInverseTransform(System.Drawing.Point点);...和程序集B引用A(二进制文件,而不是项目)并调用其中一个重载:vartransform=(other.Source.TransformToDisplay!=null&&other.Source.TransformToDisplay.Valid)?other.Source.TransformToDisplay:null;如果(变换!=null){e.Location=transform.InverseTransform(e.Location);准确地说,它调用InverseTransform方法的System.Windows.Point重载,因为这是e属性Location类型。但是当我在IDE中构建B时,我得到:错误CS0012:类型“System.Drawing.Point”在未引用的程序集中定义。您必须添加对程序集“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。即使这甚至不是我所说的超载。当我注释掉对重载方法InverseTransform的调用时,它构建良好,即使我仍在实例化ITransform类型的对象。为什么?有没有办法在不添加对System.Drawing的引用的情况下解决这个问题?编译器需要知道System.Drawing.Point是什么来证明它不是正确的重载(例如,如果它有隐式转换)。此方法使用System.Drawing定义的内容。如果取消注释,程序集将不再尝试使用System.Drawing;因此,没有要求。这样想,当您开始执行您的操作时,.NET说好的,我正在调用此程序集中定义的这个人并寻找要执行的适当代码。它找不到它,所以它举起手说我放弃了,你告诉我它在哪里。只需养成引用您可能使用的每个DLL的习惯。namespaceClassLibrary1{公共接口ITransform{动态InverseTransform(动态点);}}使用ClassLibrary1;使用最小起订量;namespaceConsoleApplication9{interfaceIPoint{}classPoint:IPoint{}classProgram{staticvoidMain(string[]args){vartransform=newMock();IPointx=transform.Object.InverseTransform(newPoint());}}}而不是告诉你什么不能做...这个问题的解决方案需要引入IPointTransform(IPointx)作为接口的唯一方法,以及IPoint接口。这意味着System.Drawing也必须符合您的IPoint。如果您想要那种解耦,就会想到dynamic关键字,因为您不能让Drawing.Point在事后实现接口。确保您对这部分代码有很好的单元测试覆盖率,并期望它的执行速度稍慢。这样,您只需要在实际使用它的程序集中引用System.Drawing。编辑反射器说System.Drawing.Point的签名是[Serializable,StructLayout(LayoutKind.Sequential),TypeConverter(typeof(PointConverter)),ComVisible(true)]publicstructPoint{}重载之间的唯一区别是类型.这就是为什么编译器在不查看类型的情况下无法判断您正在使用哪个重载的原因。由于执行程序集不引用类型,编译器不知道类型,需要直接引用包含类型定义的程序集。我自己遇到了这个问题,不想添加对包含该类型的程序集的直接引用。我只是向其中一个方法添加了一个参数(布尔值),因此它们不再是彼此的重载。然后编译器理解方法之间的区别,即使它们具有相同的名称,因为它们具有不同数量的参数。它不再需要引用包含该类型的程序集。我知道这不是一个理想的解决方案,但我找不到其他解决方案,因为我的方法是一个构造函数,我不能以任何其他方式更改它的签名。要解决此问题(并提供您没有太多包装等调用),您可以简单地为您仅使用的“Point”调用定义一个扩展包装器,例如publicstaticPointMyInverseTransform(thisITransformmytransform,Pointpoint){returnmytransform.InverseTransform(point);}...提供lib(带扩展名)System.Drawing参考(并避免在任何地方添加你的“包装库”,因为这违背了目的,只需将它放在你已经在一些引用的公共库中的地方,与问题相关.最好是“源”库的一部分,但如果你不能改变它,请说明)...然后通过MyInverseTransform调用它。以上是C#学习教程:为什么我(有时)必须引用我引用的程序集所引用的程序集?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: