繁体   English   中英

尝试将其引用到其他项目中时出现dnlib库问题

[英]dnlib library issue when trying to reference it into other project

使用Visual Studio 2013,我已经成功编译了conflibsde4dot项目的一部分dnlib的最新版本,默认情况下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项目中的默认FW目标为2.0,应该是有充分的理由,因为它涉及外部程序集,因此,我不确定通过增加dnlib项目中的FW目标来解决此问题。 ,但是无论如何,我都尝试将其增加到4.0,以了解发生了什么情况,并且我在mscorlib.dll中遇到了很多有关类型defs的编译器错误。

我想念什么吗?

如何解决此问题,以便能够使用针对FW2.0的dnlib.dll编译针对FW4.0的项目?

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

除了注释掉它们之外,还有两种简单的方法来摆脱警告。

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

打开基本的Net 2.0解决方案。 在解决方案资源管理器中选择解决方案(dnlib)。 在“文件”菜单上,选择“ 将dnlib.sln另存为”,然后使用dnlib20.sln作为文件名。 这是您的NET 2.0 FrameWork解决方案。

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

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

注意:您也可以对其进行设置,以使解决方案可以编译到它们自己的文件夹中,以免混淆。 在“构建”选项卡上,下一个输出添加一个文件夹( ..\\Debug\\bin\\Net20..\\Debug\\bin\\Net40 )。 您必须同时更改/更新Debug和Release版本。

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

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

在Net 2.0 dnlib 项目文件中,转到项目属性->生成->常规,添加条件编译符号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个比较警告,但是从其外观看,那些警告可以忽略(代码似乎在执行其所需的操作)。

这为我工作:

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

我使用了Visual Studio 2012。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM