【问题标题】:How to access a referenced assembly's types?如何访问引用程序集的类型?
【发布时间】:2015-09-18 23:08:27
【问题描述】:

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

【问题讨论】:

  • 请不要在问题标题中重复标签。
  • @OndrejTucny 哦,好吗?没有意识到这是一个规则,对不起。

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


【解决方案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,因为没有明确的类型引用.. - 但我实际上从未尝试过它是为了这个效果,所以我不能百分百确定

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

【讨论】:

  • 是的,我刚刚“镜像”了 A.dll 中存在于 B.dll 中的一些枚举。我不需要 B.dll(或想为其维护另一个 nuget 包),因为我只是使用其中的一些枚举,这些枚举恰好被用作 A.dll 的一部分的函数中的函数参数。
  • 这纯粹是在制造混乱,你应该重新设计你的项目或者只是参考B.dll
  • @MDeSchaepmeester 我需要引用整个 dll 才能使用枚举,这很愚蠢。同样愚蠢的是,如果您想要创建一个位于 EF 和其他库之类的东西之上的公共库,除了公共库之外,您还需要引用这些库。也许这并不傻,我在这里遗漏了一些东西,但现在这似乎是一个毫无意义的障碍。例如,我现在有两个可能是不同版本的库引用,而不仅仅是引用同一个 dll(比如使用 nuget 包时)
  • @slight 你 缺少一些东西。您的公共库包应包含其封装的正确版本。对于大型项目,我觉得 nuget 更像是一种负担,而不是一种工具。这就是为什么我们不在公司使用它,而是使用包含所有外部二进制文件的内部“包”(不是 nuget)。我们经常使用的另一种技术是从外部域映射到我们自己的程序集中的某些内容(例如,您正在谈论的枚举)。看看 automapper,你几乎不需要编写任何代码来做到这一点。
  • @sligh 顺便说一下,每次我们添加对 DLL 的引用时,我们都会确保“specificversion”为“false”。
【解决方案2】:

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

【讨论】:

  • 谢谢,我对你们俩都投了赞成票,但另一个人在他的回答中有其他选择,所以我给了他支票,因为你们俩都在几秒钟内互相发帖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多