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

时间:2014-07-26 18:27:29

标签: c# .net vb.net .net-framework-version de4dot

使用VisualStudio 2013我已经成功编译了dnlib的最新版本,它是ConfuserExde4dot项目的一部分,默认情况下是 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为目标的项目?

2 个答案:

答案 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.csExtensionAttribute.cs。保存,清洁和构建,你应该很好。

您不需要这两个文件,因为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 项目文件中,转到项目属性 - &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。