微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反编译的DLL-CS1660无法转换为“代理”,因为类型不是委托类型

如何解决反编译的DLL-CS1660无法转换为“代理”,因为类型不是委托类型

我用dotpeek反编译了一个.net 4.6.1项目dll。反编译后,出现以下错误

CS1660无法转换为“委托”,因为类型不是委托类型

private void MainLogAdd(string s,System.Drawing.Color color)
    {
      this.logcol.Add(color);
      this.lstLogBox.Invoke((delegate) (() =>
      {
        this.lstLogBox.Items.Add((object) ("[" + DateTime.Now.TimeOfDay.ToString().Substring(0,8) + "] " + s));
        this.lstLogBox.TopIndex = this.lstLogBox.Items.Count - 1;
      }));
    }

使用新操作更改后,“操作1不包含采用其参数的构造函数

'

解决方法

我相信,只要将(delegate)更改为(Action)即可解决问题

之前:

this.lstLogBox.Invoke((delegate) (() =>

之后:

this.lstLogBox.Invoke((Action) (() =>

这是一个例子:

enter image description here

编辑

您说您已经有一个名为Action的类,它正在引起冲突。您可以使用全名:

this.lstLogBox.Invoke((System.Action) (() =>

或者您可以通过例如创建别名将其放在班级顶部:

using SystemAction = System.Action;

然后使用别名。

this.lstLogBox.Invoke((SystemAction) (() =>

或者您可以重命名您的班级:)

,

(delegate)替换为new System.Action

    this.lstLogBox.Invoke(new System.Action(() =>
    {
        this.lstLogBox.Items.Add((object) ("[" + DateTime.Now.TimeOfDay.ToString().Substring(0,8) + "] " + s));
        this.lstLogBox.TopIndex = this.lstLogBox.Items.Count - 1;
    }));

Invoke方法接受类型为Delegate的参数,该参数是抽象类,并且是所有委托的基本类型。

Lambda表达式可以编译为表达式树(Expression<Func<...>>)或普通委托(ActionFunc)。 C#编译器需要知道委托的确切类型,以便可以为lambda表达式生成代码。

顺便说一下,这是大多数C#反编译器的问题。我最幸运的是与ILSpy在一起。

,

传递给.Invoke()的值必须是实际的实例化委托类型,例如Action,因为Windows窗体库是在C#中存在lambda之前创建的。与其像反编译器所写的那样将lambda强制转换为delegate,它还应读取如下内容:

this.lstLogBox.Invoke(new Action(() => { ... }));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。