使用VisualStudio 2013,我成功地编译了德尼布的最新版本,这是ConfuserEx和de4dot项目的一部分,dnlib项目默认目标是.NET Framework2.0,因此它应该兼容于其他针对更高版本的项目中引用它,但是当我在新项目中引用生成的dnlib.dll时,该项目的.NET框架大于3.0E 210项目无法编译。
有,任何编译错误信息,只是一个VisualStudio消息箱,上面写着:
存在构建错误。是否继续并运行上一次成功的构建?
我在一个(新的、空的) dnlib.dll项目中使用了dnlib.dll的调试和发布版本,我尝试了针对FW 3.5、4.0、4.5和4.5.1,但是该项目已经成功地编译,只针对FW2.0和3.0。
另一方面,我完全能够浏览库成员,并在其中执行类以及所有这些,但无法使用引用的dnlib.dll编译项目。
我认为,如果dnlib项目中的默认FW目标是2.0,这是有充分理由的,因为它会触摸外部程序集,所以我不确定通过在dnlib项目中增加FW目标来解决这个问题,但无论如何,我尝试将其增加到4.0,以查看哪些有着落,并且我在中获得了很多关于类型防御的编译器错误。
我漏掉了什么?
如何解决这个问题,以便能够用引用的FW2.0目标dnlib.dll编译一个以FW4.0为目标的项目?
发布于 2014-07-29 18:20:18
好的,随便摆弄一下,我可以得到一些Warnings,但没有错误。根据MSDN,ExtensionAttribute是在NET3.0中产生的,而HandleProcessCorruptedStateExceptionsAttribute是在NET4.0中产生的。因此,为了使NET2.0代码与4.0项目兼容,它提供了缺少的属性。警告只是表示它们是乘法定义的,而且由于它们只是属性,所以我认为这并不重要。
与其对它们进行评论,还有两种简单的方法来消除这些警告。
方法1(我认为更好):为Net2.0和4.0构建创建解决方案。
打开基本的Net2.0解决方案。在解决方案资源管理器中选择解决方案(dnlib)。在“文件”菜单上,选择,将dnlib.sln保存为,并使用dnlib20.sln作为文件名。这是您的NET2.0 FrameWork解决方案。
再次将保存为,这一次将保存到dblib40.sln。这将是您的NET4.0框架工作解决方案。将控制台测试项目和dnlib库项目切换到Net4.0目标平台。然后,在解决方案资源管理器中,从解决方案中排除最后两个文件:HandleProcessCorruptedStateExceptionsAttribute.cs和ExtensionAttribute.cs。保存它,清洁和建造,你应该是好的。
您不需要这两个文件,因为NET已经定义了它们(这是警告);它们只适用于2.0项目/解决方案。
注意:您也可以设置它,以便将解决方案编译到它们自己的文件夹中,这样您就不会混淆它们。在Build上,下一个输出添加一个文件夹(..\Debug\bin\Net20和..\Debug\bin\Net40)。您必须更改/更新调试和发布版本。
方法2:定义一些条件编译器常量。
创建如上所述的dblib20.sln和dblib40.sln解决方案(除非您甚至不想使用2.0)。确保在4.0解决方案中将框架设置为Net4。
在NET2.0dnlib项目文件中,转到项目属性-> 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解决方案中定义,所以只有在使用/打开Net2.0解决方案时才会编译这些类。如果您下载了另一个更新,除非它们提供了一个NET4.0解决方案文件,否则您将不得不重新执行此操作。
AFAIK,仍然没有任何内置的FrameWork常量。
最后,当清除这些警告时,有5个比较警告,但从外观上看,这些警告可以忽略(代码似乎在做它想做的事情)。
发布于 2014-07-29 17:22:48
这对我起了作用:
将dnlib项目的目标版本更改为.NET 4.0框架客户端配置文件。将示例项目目标版本更改为.NET 4.0框架客户端配置文件。删除/注释掉中的ExtensionAttribute.cs中的ExtensionAttribute,删除/注释掉dnlib中的ExtensionAttribute.cs,然后编译,没有得到任何错误。
我使用了2012。
https://stackoverflow.com/questions/24974182
复制相似问题