当一个类继承Dictionary <t1,t2 =“”>

时间:2018-06-16 20:22:10

标签: c# roslyn

由于某种原因,当访问继承自Dictionary的类时,.NET Core上的Roslyn会抛出错误。

  

CS0012:类型'Dictionary&lt;,&gt;'在未引用的程序集中定义。您必须添加对程序集'System.Collections,Version = 4.1.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用。

我的语法树看起来像这样:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using JQL.Core;

namespace RoslynCompileSample
{
    public class Writer
    {
        public object LinqIt(string outKey, Dictionary<string

            IEnumerable<TestClass>> db)
        {
            return db[outKey] = ({$linq
            });
        }
    }
}

我的推荐信:

MetadataReference[] references = new MetadataReference[]
{
    MetadataReference.CreateFromFile(typeof(JQLQuery).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(System.Runtime.AssemblyTargetedPatchBandAttribute).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(DynamicAttribute).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(System.Collections.Generic.Dictionary<,>).Assembly.Location),
    MetadataReference.CreateFromFile(typeof(System.Collections.Generic.Dictionary<string,object>).Assembly.Location)
};

我的班级

    public class TestClass : Dictionary<string, object>
    {
        public int age { get; set; }

        public TestClass()
        {
            this.age = 10;
        }
    }

如果对象是在Roslyn SyntaxTree中定义的,则

字典有效。如果传入任何Dictionary或继承的对象,我会收到错误。

知道可能导致这种情况的原因吗?我的收藏版本实际上是4.3.0,所以不确定为什么它甚至要求更低的版本。

2 个答案:

答案 0 :(得分:1)

动态编译程序集(.Net Core 3.1)遇到相同的问题。

在下面的代码中:

public IEnumerable<object> GetMetadata()
{
    return _objects.Select(GetMetadata).ToList();
}

是对System.Collections的必需引用。

The type 'List<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Collections, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

但是引用这样的东西

typeof(System.Collections.IList).Assembly

已返回System.Private.CoreLib.dll的位置。

所以

const string longName = "System.Collections, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";

var systemCollectionsAssembly = Assembly.Load(longName);

提供的参考。

答案 1 :(得分:0)

我最终通过手动引用它所要求的System.Collections dll解决了这个问题:

string longName = "System.Collections, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";

Assembly assemCollec = Assembly.Load(longName);

MetadataReference[] references = new MetadataReference[]
{
    MetadataReference.CreateFromFile(assemCollec.Location),
    // Other Assemblies . . .

};

希望这可以帮助遇到此问题的其他人。