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

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类型参数的方法却不会?

这不是因为构造函数的依赖关系需要在编译时就确定,而方法的依赖关系只需要在运行时确定吗?说实话,这有点猜测! - Liam
2个回答

6
很难确定您是否有依赖关系。但是,您将拥有编译时依赖项。运行时依赖性则更难解释。
编译时依赖性存在,因为C#编译器坚持认为它需要知道构造函数的所有重载,以便可以调用正确的构造函数。如果它不知道SharpDX.dll的元数据并且无法加载,则无法做到这一点。
这不是返回SharpDX.Device的方法的情况,返回类型永远不会用于确定哪个重载是正确的。

0

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

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

同样适用于第二种情况:只要你不调用 GetDevice 方法,就不需要添加显式引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接