【问题标题】:FileLoadException when use Roslyn in VSTO plugin for Word在 Word 的 VSTO 插件中使用 Roslyn 时出现 FileLoadException
【发布时间】:2021-05-06 17:33:02
【问题描述】:

我下载了一个Roslyn源代码,按照here的说明构建了一切

我参考了3个文件:

Microsoft.CodeAnalysis.dll    
Microsoft.CodeAnalysis.Features.dll    
Microsoft.CodeAnalysis.Workspaces.dll

但是当我运行以下代码时,我收到以下错误:

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        try
        {
            foo();
        }
        catch (Exception ex) // here ERROR !
        {

        }
    }

    private void foo()
    {
        var workspace = new AdhocWorkspace();
        var proj = workspace.AddProject("abc", "c#");
    }
}

System.IO.FileLoadException.Message

无法加载文件或程序集“Microsoft.CodeAnalysis.Workspaces, 版本=42.42.42.42,文化=中性,PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。无法使用强名称签名 已验证。组件可能已被篡改,或者是延迟 使用正确的私钥签名但未完全签名。 (例外 来自 HRESULT:0x80131045)

System.IO.FileLoadException.FusionLog

=== Pre-bind state information ===
LOG: DisplayName = Microsoft.CodeAnalysis.Workspaces, Version=42.42.42.42, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///C:/Users/google-dev/source/repos/WordAddIn1/WordAddIn1/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : WordAddIn1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Microsoft.CodeAnalysis.Workspaces, Version=42.42.42.42, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL file:///C:/Users/google-dev/source/repos/WordAddIn1/WordAddIn1/bin/Debug/Microsoft.CodeAnalysis.Workspaces.DLL.
ERR: Failed to complete setup of assembly (hr = 0x80131045). Probing terminated.

相反,如果我通过 nuget 安装 roslyn,则不会发生错误。

如果我使用我在 WPF 项目中构建的文件,一切正常,问题仅出在 VSTO 中。

我正在使用源代码自己构建 Roslyn,因为我需要 RegexParser 并且我正在公开它。

如何创建自己的强名称密钥并使用该密钥签署 Roslyn? 这会导致什么问题?

总结一下问题是:为什么会出现错误,使用我从源代码编译的文件该怎么做。

【问题讨论】:

    标签: c# .net vsto roslyn strongname


    【解决方案1】:

    当您在本地构建 Roslyn 时,二进制文件是“延迟签名”的,这意味着它们没有完整的强名称签名。这是因为用于签署这些密钥的密钥是未检入存储库的 Microsoft 私钥。对于大多数运行完全信任的常规应用程序(如您的 WPF 应用程序)来说,这个技巧不是问题,但我猜 VSTO 出于某种原因正在强制执行这一点。如果您愿意,您可以创建自己的强名称密钥并使用该密钥对其进行签名,尽管这取决于您尝试执行的操作,这可能会导致其他问题。

    (如果您修改问题以解释为什么要从源代码构建而不是使用构建的二进制文件,这会使建议更容易给出。)

    【讨论】:

    • 如果我用我创建的新文件替换 35MSSharedLib1024.snk 文件,我会遇到很多构造错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多