关于我想要理解的程序集依赖关系,有一个微妙的观点。我有一个项目,通过自定义包装器使用SharpDX,如下所示:
SharpDX.dll< - Wrapper.dll< - Project.dll
在Wrapper.dll中是一种类型:
public class D3DWrapperTypeA {
//public D3DWrapperTypeA(SharpDX.Device device) {
//
//}
public D3DWrapperTypeA(IntPtr devicePointer) {
SharpDX.Device device = new SharpDX.Device(devicePointer);
// etc
}
}
在这个类中,如果我取消注释注释的构造函数,那么Project.dll必须引用SharpDX.dll,即使它不使用构造函数。
但是,我还有另外一种包装类型:
public class WrapperTypeB {
public SharpDX.Device GetDevice(int adapter) {
// etc
}
public IntPtr GetDevicePointer(int adapter) {
return GetDevice(adapter).NativePointer;
}
}
在这里,只要我实际上不使用返回SharpDX对象的GetDevice方法,Project.dll就不需要引用SharpDX.dll。
为什么即使是未使用的构造函数接受SharpDX类型的参数也会导致对SharpDX的依赖,而返回SharpDX类型参数的未使用的方法则不会?
答案 0 :(得分:6)
目前还不清楚你知道你是如何依赖的。但是,您将具有编译时依赖项。运行时依赖将更难解释。
编译时依赖性存在是因为C#编译器坚持认为它需要知道构造函数的所有重载,以便它可以调用正确的重载。如果SharpDX.Device无法加载SharpDX.dll的元数据,它将无法做到这一点。
这是不返回SharpDX.Device的方法的情况,返回类型从不用于确定哪个重载是正确的。
答案 1 :(得分:0)
在这两种情况下,Project.dll
都依赖于SharpDX.dll
,这是完全正常的。在这两种情况下,SharpDX.dll
都将复制到输出bin
文件夹并在运行时使用。
在第一种情况下,只要您从未尝试调用SharpDX.dll
类的构造函数,就不需要显式添加对D3DWrapperTypeA
的引用。即使您尝试调用第二个构造函数,仍需要引用。
对于第二种情况也是如此:只要您从不调用GetDevice
方法,就不需要添加显式引用。