使用VisualStudio 2013我已经成功编译了dnlib的最新版本,它是ConfuserEx和de4dot项目的一部分,默认情况下是 dnlib 项目针对.NET Framework 2.0,因此它应该兼容在其他针对更高版本的项目中引用它,但是当我在新项目中引用生成的 dnlib.dll 时一个大于 3.0的.NET框架项目无法编译。
任何编译错误信息只是一个VisualStudio消息框,上面写着:
存在构建错误。你想继续并运行最后一个 成功建造?
我使用 dnlib.dll 的调试和发布版本在(新的,空的)WinForms项目中尝试了 dnlib.dll ,我已经尝试针对FW 3.5,4.0,4.5和4.5.1,但该项目已成功编译,仅针对FW 2.0和3.0。
另一方面,我完全能够浏览库成员并在其中实例化所有类,但无法用引用的 dnlib.dll 编译项目。< / p>
我认为如果dnlib项目中的默认FW目标是 2.0 应该是有充分理由的,因为它会触及外部程序集,所以我不确定尝试解决这个问题通过增加dnlib项目中的FW定位问题,但无论如何我试图将其增加到 4.0 以查看有什么问题,并且我在 mscorlib中得到了很多关于类型defs的编译器错误。 DLL
我错过了什么?
如何解决此问题,以便能够使用针对FW2.0引用的dnlib.dll编译以FW4.0为目标的项目?
答案 0 :(得分:2)
好的,摆弄,我可以得到一些Warnings
但不是错误。根据MSDN,ExtensionAttribute
与Net 3.0和HandleProcessCorruptedStateExceptionsAttribute
与NET 4.0一起出现。因此,为了使.NET 2.0代码与4.0项目兼容,它提供了缺少的属性。警告只是它们被多重定义,因为它们只是属性,我认为这不重要。
除了评论它们外,还有两种简单的方法可以摆脱警告。
方法1(我认为更好):为Net 2.0和4.0版本创建解决方案。
打开基本的Net 2.0解决方案。在Solution Explorer中选择Solution(dnlib)。在文件菜单上选择将dnlib.sln另存为并使用dnlib20.sln
作为文件名。这是您的NET 2.0 FrameWork解决方案。
再次另存为,这次是dblib40.sln
。这将是您的Net 4.0 Framwwork解决方案。将控制台测试项目和dnlib库项目切换到Net 4.0 Target平台。然后,在解决方案资源管理器中,从解决方案中排除最后2个文件:HandleProcessCorruptedStateExceptionsAttribute.cs
和ExtensionAttribute.cs
。保存,清洁和构建,你应该很好。
您不需要这两个文件,因为NET已定义它们(这是警告);它们仅适用于2.0项目/解决方案。
注意:您也可以对其进行设置,以便解决方案可以编译到自己的文件夹中,这样就不会让他们感到困惑。在“构建”选项卡上,下一个输出添加一个文件夹(..\Debug\bin\Net20
和..\Debug\bin\Net40
)。您必须更改/更新Debug和Release版本。
方法2:定义一些条件编译器常量。
如上所述创建dblib20.sln
和dblib40.sln
解决方案(除非您不想使用2.0)。请务必在4.0解决方案中将Framework设置为NET 4.
在Net 2.0 dnlib 项目文件中,转到项目属性 - &gt;构建 - &gt;常规添加条件编译符号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个比较警告,但从它的外观来看,这些可以被忽略(代码似乎正在按照它想要的那样)。
答案 1 :(得分:1)
这对我有用:
将dnlib项目的目标版本更改为.NET 4.0 Framework Client Profile。 将Example项目目标版本更改为.NET 4.0 Framework Client Profile。 删除/注释掉dnlib中ExtensionAttribute.cs中的ExtensionAttribute 删除/注释掉dnlib中的HandleProcessCorruptedStateExceptionsAttribute 然后我编译并没有错误。
我使用的是Visual Studio 2012。