gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:04:42 37 4
gpt4 key购买 nike

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

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

There were build errors. Would you like to continue and run the last successful build?

我在一个(新的,空的)WinForms 项目中尝试了 dnlib.dll,同时使用了 dnlib.dll 的调试版和发行版,我已经尝试以固件 3.5、4.0、4.5 和 4.5.1 为目标,但该项目仅以固件 2.0 和 3.0 为目标编译成功。

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

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

我错过了什么?

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

最佳答案

好吧,摆弄一下,我可以得到一些警告但不是错误。根据 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 目标平台。然后,在解决方案资源管理器中,从解决方案中排除最后两个文件:HandleProcessCorruptedStateExceptionsAttribute.csExtensionAttribute.cs。保存它,清理并构建,你应该会很好。

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

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

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

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

在 Net 2.0 dnlib project 文件中,转到 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 解决方案文件,否则您将不得不重做。

据我所知,仍然没有任何内置的 FrameWork 常量。

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

关于c# - 尝试将其引用到其他项目时出现 dnlib 库问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974182/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com