Visual Studio扩展中的RoslynPad FileNotFoundException

时间:2018-07-18 11:10:52

标签: c# wpf roslyn vsix roslynpad

有人成功管理了Visual Studio Extension(VSIX)中的WPF RoslynPad编辑器(仅供参考:我正在使用Visual Studio 2015 Enterprise)吗?

当尝试像这样在VSIX中初始化Roslyn主机时:

var host = new RoslynHost(additionalAssemblies: new[]
{
    Assembly.Load("RoslynPad.Roslyn.Windows"),
    Assembly.Load("RoslynPad.Editor.Windows")
});

我收到以下错误:

  

无法加载文件或程序集'System.Collections.Immutable,版本= 1.2.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。系统找不到指定的文件。“:”“ System.Collections.Immutable,版本= 1.2.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a”

堆栈跟踪为:

 at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeAssembly.get_DefinedTypes()
   at RoslynPad.Roslyn.RoslynHost.<>c.<.ctor>b__20_0(Assembly x)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Composition.TypedParts.TypedPartExportDescriptorProvider..ctor(IEnumerable`1 types, AttributedModelProvider attributeContext)
   at System.Composition.Hosting.ContainerConfiguration.CreateContainer()
   at RoslynPad.Roslyn.RoslynHost..ctor(NuGetConfiguration nuGetConfiguration, IEnumerable`1 additionalAssemblies, RoslynHostReferences references)

请注意,RoslynPad提供的“ RosylnPadPelSample” WPF应用程序中可以使用相同的代码。

让我大吃一惊的是,它正在寻找System.Collections.Immutable版本1.2.0.0(我相信这是System.Reflection.Metadata.dll中的依赖项),因为示例应用程序不包含此文件。它具有1.2.0.1版(与我的扩展程序相同的版本),但是具有绑定重定向,可以弥补其遗漏:

<dependentAssembly>
        <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.1.0" newVersion="1.2.1.0" />
</dependentAssembly>

如果我明确添加System.Collections.Immutable版本1.2.0.0作为参考,那么我会从RoslynPad获得相同的异常,但是这次它找不到System.Collections.Immutable版本1.2.0.1!绑定重定向在Visual Studio扩展中似乎没有生效。有谁知道如何在Visual Studio Extensions中完成绑定重定向或如何解决此问题?

1 个答案:

答案 0 :(得分:0)

我相信您不能在VS内部使用.config文件进行程序集绑定重定向,但是可以使用AppDomain.AssemblyResolve事件来达到类似的效果。

例如,请参见此blog post