2

使用 VisualStudio 2013,我已经成功编译了最新版本的dnlib,它是ConfuserExde4dot项目的一部分,默认情况下, dnlib项目以 .NET Framework 2.0 为目标,因此它应该兼容以在其他针对更高版本的项目中引用它,但当我在一个针对大于3.0的 .NET 框架的新项目中引用生成的dnlib.dll时,该项目无法编译。

任何编译错误信息只是一个 VisualStudio 消息框,上面写着:

存在构建错误。您想继续并运行最后一次成功的构建吗?

我已经使用dnlib.dll的调试和发布版本在(新的、空的)WinForms 项目中尝试了dnlib.dll,我尝试针对 FW 3.5、4.0、4.5 和 4.5.1 但该项目已经仅针对 FW 2.0 和 3.0 成功编译。

另一方面,我完全能够浏览库成员并实例化其中的类以及所有这些,但无法使用引用的dnlib.dll编译项目。

我认为如果 dnlib 项目中的默认固件目标是2.0应该是有充分理由的,因为它涉及外部程序集,所以我不确定通过增加 dnlib 项目中的固件目标来解决这个问题,但无论如何我已经尝试将其增加到4.0以查看发生了什么,并且我得到了很多关于mscorlib.dll中的类型定义的编译器错误。

我错过了什么?

我如何解决这个问题,以便能够编译一个以 FW4.0 为目标的项目,并且引用了以 FW2.0 为目标的 dnlib.dll?

4

2 回答 2

2

好的,摆弄一下,我可以得到一些Warnings但不是错误。根据 MSDN,ExtensionAttribute 随着 Net 3.0 和HandleProcessCorruptedStateExceptionsAttributeNET 4.0 的出现。因此,为了使 NET 2.0 代码与 4.0 项目兼容,它提供了缺少的属性。警告只是它们被多重定义,并且由于它们只是属性,我认为这并不重要。

无需将它们注释掉,有两种简单的方法可以消除警告。

方法 1(我认为更好):为 Net 2.0 和 4.0 构建创建解决方案。

打开基本的 Net 2.0 解决方案。在解决方案资源管理器中选择解决方案 (dnlib)。在 File 菜单上选择Save dnlib.sln Asdnlib20.sln用作文件名。这是您的 NET 2.0 框架解决方案。

再次另存为,这次是dblib40.sln. 稍后,这将是您的 Net 4.0 Framwwork 解决方案。将控制台测试项目和 dnlib 库项目都切换到 Net 4.0 目标平台。然后,在解决方案资源管理器中,从解决方案中排除最后 2 个文件: HandleProcessCorruptedStateExceptionsAttribute.csExtensionAttribute.cs. 保存它,清理并构建,你应该会很好。

您不需要这两个文件,因为 NET 已经定义了它们(这是警告);它们仅适用于 2.0 项目/解决方案。

注意:您也可以将其设置为将解决方案编译到自己的文件夹中,这样您就不会混淆它们。在 Build 选项卡上,下一个输出添加一个文件夹(..\Debug\bin\Net20..\Debug\bin\Net40)。您必须更改/更新 Debug 和 Release 版本。

方法二:定义一些条件编译器常量。

如上所述创建dblib20.slndblib40.sln解决方案(除非您甚至不想使用 2.0)。请务必在 4.0 解决方案中将 Framework 设置为 NET 4。

在 Net 2.0 dnlib项目文件中,进入Project Properties --> Build --> General添加条件编译符号NET20。现在,HandleProcessCorruptedStateExceptionsAttribute.cs将代码包装在一个#if

#if NET20

using System;
#pragma warning disable 1591    // XML doc warning

namespace System.Runtime.ExceptionServices {
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
    sealed class HandleProcessCorruptedStateExceptionsAttribute : Attribute {
    }
}

#endif

ExtensionAttribute.cs中,做同样的事情。然后清理并重建,一切都应该很好。由于符号仅在 NET20 解决方案中定义,因此只有在您使用/打开 Net 2.0 解决方案时才会编译这些类。如果您下载另一个更新,除非他们提供 NET 4.0 解决方案文件,否则您将不得不重做。

AFAIK,仍然没有任何内置的 FrameWork 常量。

最后,当这些警告被清除时,有 5 个比较警告,但从外观上看,这些可以被忽略(代码似乎在做它想做的事)。

于 2014-07-29T18:20:18.223 回答
1

这对我有用:

将 dnlib 项目的目标版本更改为 .NET 4.0 Framework Client Profile。将示例项目目标版本更改为 .NET 4.0 Framework Client Profile。删除/注释掉 dnlib 中 ExtensionAttribute.cs 中的 ExtensionAttribute 删除/注释掉 dnlib 中的 HandleProcessCorruptedStateExceptionsAttribute 然后我编译并没有错误。

我使用了 Visual Studio 2012。

于 2014-07-29T17:22:48.640 回答