簡體   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