如果我在项目中引用程序集A.dll而A.dll引用B.dll。我的项目无法访问B.dll的导出名称空间/类,只能访问A.dll。有什么我可以做的,所以我不必在我的项目中直接引用B.dll才能访问它的类吗?
答案 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
之外别无其他。