【问题标题】:Assembly path when created by Reflection (C#) [closed]由反射(C#)创建时的装配路径[关闭]
【发布时间】:2014-07-15 05:55:55
【问题描述】:

我有一个奇怪的情况,当通过反射创建时使用了错误的程序集。

这是我的设置(简化):

Project1:类库

项目 2:客户端应用程序

  • Project2 通过从特定路径反射创建 Project1.dll (C:\Project1)
  • Project2 还具有对 Project1.dll 的引用 用于不同的功能。此参考将 Project1.dll 复制到 C:\Project2\bin\Debug。

相关反射代码为:
Assembly assembly = Assembly.LoadFrom(path);

问题: 当我通过反射调用 Project1 时,即使我指定了 C:\Project1 路径,它实际上也使用了 bin\Debug 副本(不一定是正确的版本)。

问题: 如何确保使用我提供的路径而不是首先找到的任何版本?

我理想的解决方案是将 Project1 一分为二,一个用于反射,一个用于参考,但在我的情况下这不是一个选项(可以,但它有额外的复杂性)。

谢谢你,
西蒙

【问题讨论】:

  • 为什么投反对票?
  • 我不知道。也许人们想看代码......不过,这个问题并不是真的有必要。
  • 无论哪种方式,没有解释的反对票(或赞成票)没有太大用处。
  • 您使用哪个函数来加载程序集?
  • ZenLulz,我更新了问题,谢谢。

标签: c# .net reflection .net-assembly probing


【解决方案1】:

感谢您更新您的帖子。这一行说明了您遇到此行为的原因。

LoadFrom 方法按定义工作:

加载源上下文包含用户为其提供的程序集 通过探测搜索的目录中未包含的路径。加载自, CreateInstanceFrom 和 ExecuteAssembly 是这些方法的示例 按路径加载。

探测是在 GAC、宿主程序集存储、执行程序集的文件夹或执行程序集的私有文件夹中查找程序集的过程。

由于您已经引用了程序集,它只返回与您在参数中提供的名称匹配的已加载程序集。

您要查找的方法是LoadFile。 MSDN 声明如下:

使用 LoadFile 方法加载和检查具有 相同的身份,但位于不同的路径。加载文件不 将文件加载到 LoadFrom 上下文中,并且不解析 使用加载路径的依赖项,就像 LoadFrom 方法一样。


其他资源

LoadFile vs. LoadFrom 由 Suzanne Cook 在她的博客 .NET CLR Notes 上撰写。

小心 - 这些不是一回事。

LoadFrom() 会通过 Fusion,并且可以重定向到位于不同路径但具有相同标识的另一个程序集,如果是 已经加载到 LoadFrom 上下文中。 LoadFile() 根本不通过 Fusion 绑定 - 加载器只是继续并准确地加载*调用者请求的内容。它没有 使用 Load 或 LoadFrom 上下文。

所以,LoadFrom() 通常会给你你所要求的,但不是 一定。 LoadFile() 适合那些真正非常想要的人 要求什么。 (*但是,从 v2 开始,将应用策略 到 LoadFrom() 和 LoadFile(),所以 LoadFile() 不一定是 正是所要求的。此外,从 v2 开始,如果装配有 它的身份在 GAC 中,则将使用 GAC 副本。利用 ReflectionOnlyLoadFrom() 以准确加载您想要的内容 - 但是,请注意 以这种方式加载的程序集无法执行。)

LoadFile() 有一个问题。由于它不使用绑定上下文,它的 依赖项不会自动在其目录中找到。如果他们 在 Load 上下文中不可用,您必须订阅 AssemblyResolve 事件以绑定到它们。

【讨论】:

  • 我不知道为什么我在寻找它时错过了它......非常感谢,这正是我需要的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2018-03-31
  • 2014-04-08
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多