我想了解有关程序集依赖项的一个微妙之处。我有一个通过自定义包装器使用SharpDX的项目,如下所示:

SharpDX.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类型参数的未使用方法的构造函数呢?

最佳答案

尚不清楚您如何知道自己有依赖关系。但是,您将具有编译时的依赖性。运行时依赖性将很难解释。

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

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

关于c# - 为什么在这种情况下未使用的构造函数会导致程序集依赖关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18491741/

10-10 06:50