gpt4 book ai didi

.net - 加载 .Net 程序集时出错

转载 作者:行者123 更新时间:2023-12-01 02:41:42 27 4
gpt4 key购买 nike

我正在尝试解决在运行时使用动态加载程序集 ASSEMBLY 的问题

Assembly.loadFrom("filePath") 

在一些 DLL myDLL1.同一个 ASSEMBLY 与同一个解决方案中的另一个 DLL myDLL2 静态链接,并且从解决方案 myExecutable 调用这两个 DLL。如果在解决方案部署到的文件夹中找到完全相同的 ASSEMBLY,则此方法可以正常工作。 ASSEMBLY 有 .Net 版本 1.0.1.1 和文件版本 1.0.1.7

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

如果我将程序集的新文件版本放入解决方案部署到的文件夹中,我现在会收到错误消息。我认为这是因为.Net 运行时对根据 myDLL1 的 list 不符合预期的公钥 token 不满意,有人可以证实这个猜测吗?

与示例描述相适应的名称的 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 生成的 ASSEMBLY 文件版本 1.0.1.8 中的公钥 token 首先使用到版本 1.0.1.1 的 bindingRedirect 以及
来自与文件版本 1.0.1.7 对应的 myDLL1 的 list 信息中的 ASSEMBLY 的公钥 token ,但我得到了同样的错误。我还将重定向信息添加到 myExecutable 配置中。

然后我尝试使用带有公钥 token 的 bindingRedirect 到版本 1.0.1.2
ASSEMBLY 的较新版本。新文件版本已加载,但随后我得到,当然,修订不匹配。

谁能告诉我如何在此设置中使用 ASSEMBLY 的新文件版本,而不必替换静态链接到新文件版本的整个解决方案,当然,这确实有效?

TIA 和最好的问候,

托马斯

最佳答案

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

  • 如果程序集未使用与程序集在编译时静态链接的程序集相同的 key 签名,.Net 框架将拒绝为应用程序加载程序集。似乎无法使用 application.config 文件或 machine.config 文件更改这一点,尽管我在文档中找不到这方面的证据。在考虑了一段时间后,我认为这是合理的行为,因为它证明了应用程序的用户使用开发人员使用的相同程序集。
  • 我现在确定 1) 正确的程度如下:如果程序集的不同版本的 key 保持相同,那么绑定(bind)重定向对于这些版本可以正常工作。使用 application.config 和 machine.config 文件重新绑定(bind)都是如此。

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

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

    我不知道是否可以通过弄乱 .Net Framework 的 security.config 文件来更改 1) 中描述的行为。 (尽管即使可以这样更改,这也可能会引入我不想在我的 PC 上创建的安全风险)。

    关于.net - 加载 .Net 程序集时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095410/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com