C# 如何访问引用的程序集';什么类型?

C# 如何访问引用的程序集';什么类型?,c#,.net,visual-studio-2013,C#,.net,Visual Studio 2013,如果我在项目中引用程序集A.dll,而A.dll引用B.dll。我的项目无法访问B.dll的导出命名空间/类,只能访问A.dll。有什么方法可以让我不必在项目中直接引用B.dll来访问它的类吗?没有,没有办法*)您必须引用所有要使用类型的程序集。这意味着,如果使用A,并且如果使用A中的任何内容公开B中的类型,则也必须引用B 快速编辑:嗯,好的,实际上有一种方法-如果你不想使用B.dll,但如果你不介意使用XYZ.dll,你可以制作一个模拟B.dll中相关类型的XYZ.dll,然后尝试根据程序集重

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

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

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

*)事后思考:您可以尝试使用
动态
及其动态绑定:

// 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%确定


但是,当您一直使用
动态
时,您将退出许多编译时检查,并且参数类型或方法名称中的任何错误将仅在运行时出现-就像使用反射一样

此行为是设计的。除了在运行时使用反射来访问
B.dll
中的任何实体之类的东西外,没有其他方法可以直接引用
B.dll

请不要重复问题标题中的标记。@OndrejTucny好吗?对不起,我没有意识到这是一条规则。是的,我只是“镜像”了a.dll中存在于B.dll中的一些枚举。我不需要B.dll(或者想为它维护另一个nuget包),因为我只是使用了其中的一些枚举,这些枚举恰好用作a.dll的一部分函数中的函数参数。这纯粹是在制造混乱,你应该重新设计你的项目,或者只是引用
B.dll
@MDeSchaepmeester我需要引用整个dll来使用枚举,这太傻了。同样愚蠢的是,如果您想创建一个位于EF和其他库之上的公共库,那么除了公共库之外,还需要引用这些库。也许这并不愚蠢,我在这里遗漏了一些东西,但现在这似乎是一个毫无意义的障碍。例如,我现在有两个库引用,它们可能是不同的版本,而不仅仅是引用同一个dll(就像使用nuget软件包时一样)@slight您缺少了一些东西。您的公共库包应该包含它封装的库包的正确版本。对于大型项目,我觉得nuget更多的是一种负担,而不是一种工具。这就是为什么我们公司不使用它,而是使用包含所有外部二进制文件的内部“包”(而不是nuget)。我们经常使用的另一种技术是仅从外部域映射到我们自己程序集中的某个内容(例如,您正在谈论的枚举)。看看automapper,你几乎不需要编写代码就可以做到这一点。@sligh顺便说一句,每次我们添加对DLL的引用时,我们都会确保“specificversion”为“false”。谢谢,我给了你们两个更高的票数,但另一个家伙的答案中有其他选择,所以我给了他支票,因为你们两人在几秒钟内就发布了。