由反射(c#)创建时的程序集路径



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

这是我设置(简体):

Project1: Class Library

Project2:客户端app

  • Project2通过从特定路径反射创建Project1.dll(C: Project1)
  • Project2另外有一个对Project1.dll的引用不同的功能。此引用将Project1.dll复制到C: Project2 bin 调试。

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

:当我通过反射调用Project1时,尽管我指定了C:Project1路径,但它实际上使用了binDebug副本(不一定是正确的版本)。

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

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

谢谢你,
西蒙。

感谢您的更新。这一行显示了您遇到此行为的原因。

方法LoadFrom按照定义工作:

load-from上下文包含用户提供的程序集通过探测搜索的目录中不包含的路径。LoadFrom,CreateInstanceFrom和ExecuteAssembly是方法的示例按路径加载

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

由于已经引用了程序集,因此它只返回与parameter中提供的名称匹配的已加载的程序集。

您正在寻找的方法是LoadFile。MSDN声明如下:

使用LoadFile方法来加载和检查具有相同的身份,但位于不同的路径。LoadFile没有加载文件到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()有一个catch。因为它不使用绑定上下文,所以它在它的目录中不会自动找到依赖项。如果他们在Load上下文中不可用,您必须订阅

返回AssemblyResolve事件以绑定到它们。

最新更新