【问题标题】:Getting exception Method not found: 'System.Runtime.CompilerServices.CallSiteBinder找不到异常方法:'System.Runtime.CompilerServices.CallSiteBinder
【发布时间】:2017-07-30 23:34:19
【问题描述】:

我目前正在将 .net 4 dll 迁移到 .net 核心。 我正在移植我的单元测试,但无法让它们工作。

这是我的 dll 的 project.json

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.1",
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  }
}

这是我目前正在测试的课程

public class Matcher
{
    public List<ElementMatcher> matchers{ get; set; }

    public bool Match(string item, Dictionary<string, object> elements)
    {

                foreach(var matcher in matchers)
                {
                    var result = matcher.Match(item, elements);
                    if (!result)
                    {
                        return false;
                    }
                }
                return true;

    }
}

public class ElementMatcher
{
    public string attribute { get; set; }
    public IMatcher matcher { get; set; }

    public virtual bool Match(string key, Dictionary<string, object> attributes)
    {
        if (attribute == null)
        {
            return matcher.Match(key);
        }

        if (attributes == null)
        {
            return false;
        }

        object value;
        attributes.TryGetValue(attribute, out value);

        if (value == null)
        {
            return false;
        }

        return matcher.Match((dynamic)value);
    }
}

这是在 Matcher 类中抛出异常的行:

matcher.Match(item, elements);

这是我的单元测试项目中的当前依赖项:

<packages>
  <package id="Castle.Core" version="4.0.0" targetFramework="net462" />
  <package id="Microsoft.CSharp" version="4.3.0" targetFramework="net462" />
  <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
  <package id="Moq" version="4.7.1" targetFramework="net462" />
  <package id="System.Diagnostics.DiagnosticSource" version="4.0.0" targetFramework="net462" />
  <package id="System.IO" version="4.1.0" targetFramework="net462" />
  <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" />
  <package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" />
  <package id="System.IO.FileSystem.Watcher" version="4.0.0" targetFramework="net462" />
  <package id="System.Linq" version="4.1.0" targetFramework="net462" />
  <package id="System.Linq.Expressions" version="4.1.0" targetFramework="net462" />
  <package id="System.Net.Http" version="4.1.0" targetFramework="net462" />
  <package id="System.Net.NameResolution" version="4.0.0" targetFramework="net462" />
  <package id="System.Reflection" version="4.1.0" targetFramework="net462" />
  <package id="System.Runtime" version="4.1.0" targetFramework="net462" />
  <package id="System.Runtime.Extensions" version="4.1.0" targetFramework="net462" />
  <package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" />
  <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" />
  <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" />
  <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" />
  <package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" />
  <package id="System.Threading.Thread" version="4.0.0" targetFramework="net462" />
</packages>

【问题讨论】:

  • 是我自己还是这似乎是自我指涉?
  • 不是,主类是Matcher,我是从ElementMatcher类调用Match方法,不一样,没有继承
  • 你有ElementMatcher.Match的源代码吗?
  • @RodrigoVedovato 是的,我更新了我的 sn-ps。此外,此代码适用于 Net Framework v.4.0
  • @Jawen 我不会用这个作为答案,因为我不是 100% 确定,但是有没有办法在最后一行删除转换为动态?

标签: c# .net-core porting .net-4.6.2


【解决方案1】:

根据您在评论部分所说的,我认为问题不是由于框架版本之间的一些冲突而发生的。您已经说过要将库移植到 .NET Core,因此可能并非所有内容都得到完全支持。整个“转换为动态然后决定调用哪个方法”可能会造成问题(这不是解决此类问题的好方法),所以我会尝试做这样的事情:

public interface IMatcher
{
    bool Match(object value);
    bool Match(string key);
    bool Match(DateTime key);
    bool Match(long key);
}

public class MyMatcher : IMatcher
{
    public bool Match(object value)
    {
        if (value is string)
        {
            return Match(value as string);
        } 
        else if (value is DateTime)
        {
            return Match(value as DateTime);
        } 
        else if (value is long)
        {
            return Match(value as long);
        }

        return false;
    }
}

这样,您可以删除动态演员表..

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多