在这种情况下,为什么未使用的构造函数会导致程序集依赖?

时间:2013-08-28 15:10:13

标签: c# .net

关于我想要理解的程序集依赖关系,有一个微妙的观点。我有一个项目,通过自定义包装器使用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类型参数的未使用的方法则不会?

2 个答案:

答案 0 :(得分:6)

目前还不清楚你知道你是如何依赖的。但是,您将具有编译时依赖项。运行时依赖将更难解释。

编译时依赖性存在是因为C#编译器坚持认为它需要知道构造函数的所有重载,以便它可以调用正确的重载。如果SharpDX.Device无法加载SharpDX.dll的元数据,它将无法做到这一点。

这是返回SharpDX.Device的方法的情况,返回类型从不用于确定哪个重载是正确的。

答案 1 :(得分:0)

在这两种情况下,Project.dll都依赖于SharpDX.dll,这是完全正常的。在这两种情况下,SharpDX.dll都将复制到输出bin文件夹并在运行时使用。

在第一种情况下,只要您从未尝试调用SharpDX.dll类的构造函数,就不需要显式添加对D3DWrapperTypeA的引用。即使您尝试调用第二个构造函数,仍需要引用。

对于第二种情况也是如此:只要您从不调用GetDevice方法,就不需要添加显式引用。