加载.Net程序集时出错

加载.Net程序集时出错,.net,version,.net,Version,我试图分析一个问题,其中程序集在运行时使用 Assembly.loadFrom("filePath") 在某些DLL myDLL1中。同一个程序集与同一解决方案中的另一个DLL myDLL2静态链接,并且有来自解决方案myExecutable的对这两个DLL的调用。如果在部署解决方案的文件夹中找到了完全相同的程序集,则此方法可以正常工作。比如说,程序集有.Net版本1.0.1.1和文件版本1.0.1.7 现在发布了程序集的新文件版本1.0.1.8,其.Net版本1.0.1.1与程序集的文件版

我试图分析一个问题,其中程序集在运行时使用

Assembly.loadFrom("filePath") 
在某些DLL myDLL1中。同一个程序集与同一解决方案中的另一个DLL myDLL2静态链接,并且有来自解决方案myExecutable的对这两个DLL的调用。如果在部署解决方案的文件夹中找到了完全相同的程序集,则此方法可以正常工作。比如说,程序集有.Net版本1.0.1.1和文件版本1.0.1.7

现在发布了程序集的新文件版本1.0.1.8,其.Net版本1.0.1.1与程序集的文件版本1.0.1.7完全相同。程序集具有强名称,并且不同文件版本的公钥标记也不同。第一个问题:这是否合理

如果我将程序集的新文件版本放在部署解决方案的文件夹中,现在会出现错误。我假设这是因为.Net运行时对公钥令牌不满意,而根据myDLL1清单,公钥令牌不是预期的,有人能证实这个猜测吗

fuslogvw输出的名称与示例描述相适应,如下所示:

Assembly Binder Log Entry  (11.11.2011 @ 13:38:52) 

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  myExecutable
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = xxxxx
LOG: DisplayName = ASSEMBLY (Partial)
LOG: Appbase = (folder the solution is deployed to)
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = NULL
Calling assembly : myDLL1, Version=2.1.2.0, Culture=neutral, PublicKeyToken=..... 
===
LOG: Start binding of native image ASSEMBLY, Version=1.0.1.1, Culture=neutral,      PublicKeyToken=xxxxxxxx.
LOG: IL assembly loaded from ASSEMBLY.
WRN: No matching native image found.
LOG: Bind to native image assembly did not succeed. Use IL image.
我尝试先使用sn-Tp生成的程序集文件1.0.1.8版本中的公钥令牌以及 程序集的公钥令牌来自文件版本1.0.1.7对应的myDLL1清单信息,但我得到了相同的错误。我还将重定向信息添加到myExecutable配置中

然后,我尝试使用带有公钥令牌的bindingRedirect到版本1.0.1.2 更新版本的程序集的。加载了新的文件版本,但是我得到了一个版本不匹配的结果

有谁能告诉我如何在此设置中使用新的文件版本的程序集,而不必替换静态链接到新文件版本的整个解决方案,当然,这是可行的

致以最诚挚的问候


托马斯

好的,在做了更多的研究和实验之后,我现在可以自己回答我的问题了。以下是我的发现:

  • 如果程序集未使用该程序集在编译时与应用程序静态链接的密钥进行签名,则.Net framework将拒绝加载应用程序的程序集。这似乎无法使用application.config文件或machine.config文件更改,尽管我在文档中找不到这方面的证据。经过一段时间的思考,我认为这是一种合理的行为,因为它证明了应用程序的用户使用的是开发人员使用的相同程序集

  • 现在我确信1)正确的程度如下:如果对程序集的不同版本保持相同的键,那么绑定重定向对这些版本就可以正常工作。这对于使用application.config和machine.config文件重新绑定都是正确的

  • 但是,一旦使用不同的密钥对程序集进行签名,这些相同的配置文件就会停止工作。这种情况下令人讨厌的是,fuslogvw生成的日志告诉您绑定失败是由于其他原因(例如,较小的版本号不匹配)。它不会抱怨错误的公钥令牌

    另一件令人讨厌的事情是,您可以将公钥令牌作为属性添加到配置文件中的XML标记中,这在一开始就让我走错了路。我不知道为什么公钥可以或应该添加到配置文件中,因为.Net可以从程序集和应用程序二进制文件中检索此信息


    我不知道1)中描述的行为是否可以通过修改.Net Framework的security.config文件来改变。(即使可以这样更改,这也可能会带来我不想在我的电脑上创建的安全风险)。

    听起来你用不同的密钥签署了新程序集。不好,公钥令牌不应该不同。嗨,汉斯。不,我没有签名,旧的和新的组件是第三方的。是的,新的有相同的.net版本,但有一个新的公钥令牌。我的问题,换一种说法是:假设我信任程序集的新文件版本,因为我确信它来自同一个来源,比如说,是否有任何方法(例如使用配置文件)在不重新编译整个应用程序的情况下使用它。请改进您的问题标题,使其不那么含糊。否则,将来有类似问题的人将无法找到它。