6

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

4

2 回答 2

6

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

存在编译时依赖是因为 C# 编译器坚持它需要知道构造函数的所有重载,以便它可以调用正确的重载。如果它不能加载 SharpDX.dll 的元数据,它就不能这样做。

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

于 2013-08-28T15:59:57.980 回答
0

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

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

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

于 2013-08-28T15:21:02.900 回答