【问题标题】:Why is GetHostEvidence<StrongName>() returning null instead of the expected StrongName?为什么 GetHostEvidence<StrongName>() 返回 null 而不是预期的 StrongName?
【发布时间】:2019-07-24 17:15:43
【问题描述】:

我正在为我正在编写的应用程序组合一个简单的(沙盒)模块系统,以便在锁定权限(File.IO 等)的同时允许加载和执行其他人(不受信任的代码)编写的“模块”最大限度地降低恶意代码的风险。

根据文章:How to: Run Partially Trusted Code in a Sandbox

在第 2 步:签署程序集:

StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

我收到以下错误:

System.ArgumentException: '在完整的信任程序集列表中发现空的 StrongName。'

进一步调查,果然fullTrustAssembly实际上是null,再深入一点.GetHostEvidence&lt;StrongName&gt;();是返回null的方法。

我在这里找到了一个解决方案(有效):A null strongname was found in the full trust assembly list sandbox application,看起来像:

StrongName fullTrustAssembly = new StrongName(
    new StrongNamePublicKeyBlob(typeof(Sandboxer).Assembly.GetName().GetPublicKey()),
    typeof(Sandboxer).Assembly.GetName().Name,
    typeof(Sandboxer).Assembly.GetName().Version);

但是,提供该问题答案的人表示:

在 .net framework 4.0 之前,您无法通过调用 GetHostEvidence 获取 strongName。更改 .net 框架的版本。

我使用的是 .NET Framework 4.8,因此根据该声明和原始教程,GetHostEvidence() 应该可以工作。

1.为什么GetHostEvidence&lt;StrongName&gt;() 没有按照原始教程工作?

2。上述两种获取签名StrongName的不同方法的真正区别是什么?

奖励积分

Google 在我的项目的这个沙盒模块管理器部分中寻找当前的实现和教程来完成我的任务并不是我的朋友。是否有任何好的资源(除了 .NET 文档)可以更详细地了解它是如何工作的?我能找到的大部分都是过时的(10 岁以上)。是否有更多当前的策略来实现这一目标。 (注意:我已经查看了Managed Extensibility Framework (MEF) 并觉得这对于我正在从事的项目的另一个单独部分非常有用,但对于这部分来说似乎有点矫枉过正。我也看过System.Addin(MAF?)但我只能find 是与 Web/ASP 相关的信息,其中大部分也非常过时)

【问题讨论】:

    标签: c# appdomain strongname


    【解决方案1】:

    @亚伦·默里

    您是否签署了包含 SandBox 类的程序集?如果没有,您可以尝试这里提到的说明https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-sign-an-assembly-with-a-strong-name

    如果程序集未签名,则预期 typeof(Sandboxer).Assembly.Evidence.GetHostEvidence() 返回 null。

    文档https://docs.microsoft.com/en-us/dotnet/framework/misc/how-to-run-partially-trusted-code-in-a-sandbox 明确提到了步骤#2 中的签名要求

    谢谢。

    【讨论】:

    • 这正是我错过的。您提供的第二个链接(这是我正在研究的教程)对于“签署包含托管类的程序集”有点模糊。我认为这就是StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence&lt;StrongName&gt;(); 正在做的事情。一旦我进入程序集“属性”/“签名”并签署程序集,上面的行就可以正常工作(根据您的第一个链接)。现在我有了更好的理解,我可以研究更多。但是,为什么“解决方法”无需签名就可以工作?
    • 不确定您为什么要为该问题创建第二个答案,但是,这两个答案都不能真正解释为什么该变通办法适用于获取 StrongName。我现在明白了我在实际签署程序集时错过的步骤(教程并不清楚),但现在如果我没有签署它,为什么我还没有签署它仍然可以获得 StrongName?
    • 您没有从程序集中获得 StrongName 对象。您刚刚使用构造函数创建了一个 StrongName 对象,这不是一回事。当真正需要匹配正在运行的程序集时,这不能保证以后可以很好地工作。
    • 我删除了你指出的第二个答案。我不是有意将其作为第二个答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多