如何访问引用的程序集类型?

时间:2015-09-18 14:52:24

标签: c# .net visual-studio-2013

如果我在项目中引用程序集A.dll而A.dll引用B.dll。我的项目无法访问B.dll的导出名称空间/类,只能访问A.dll。有什么我可以做的,所以我不必在我的项目中直接引用B.dll才能访问它的类吗?

2 个答案:

答案 0 :(得分:1)

不,没有办法*)您必须引用要使用其类型的所有程序集。这意味着如果您使用A并且如果您使用A中暴露B类型的任何内容,则必须引用B。

快速编辑:呃,好吧,实际上有一些方法 - 如果你不想使用B.dll但是如果你不介意使用XYZ.dll,你可以制作一个XYZ .dll模仿B.dll中的相关类型,然后尝试开发一些刻度,即程序集重定向..用它你理论上可以让你的应用程序引用A.dll和XYZ.dll,但在运行时它会使用A. dll和B.dll。如果谈到项目和编译,编译器使用(或曾经使用)一些技巧来支持跨平台编译(即从WindowsPhone中删除程序集只是为了让参考得到满足)。

*)事后的想法:您可以尝试使用dynamic及其动态绑定:

// in A.dll
public dynamic Method() {
    return new ClassFromB(); // thing from B.dll
}

// in your app:
// do not ever explicitely name ANY type from:
dynamic foo = ClassFromA.Method();
dynamic result = foo.CallSomething(1,2,3); // even when getting results
dynamic other = result.Boom(foo); // and even when passing params

只要所有引用类型和方法都被dynamic遮蔽,就有可能它不会要求您引用B.dll,因为没有明确的类型引用.. - 但我实际上从未尝试过这种效果,所以我不能说100%确定

但是,当始终使用dynamic时,您将从许多编译时检查中退出,参数类型或方法名称中的任何错误都将仅在运行时升级 - 就像使用反射一样

答案 1 :(得分:1)

此行为是设计使然。除了在运行时使用反射访问B.dll中的任何实体之类的内容之外,除了直接引用B.dll之外别无其他。