1

我試圖強烈地命名第三方API,但是它使用的是第三方DLL/NuGet包也沒有強烈的名字,我遇到了很多麻煩。Box-API:如何向第三方程序集添加一個強名稱用於.NET便攜子集

我正在使用Box Windows SDK,並且該API是在.NET便攜子集中編寫的,並且支持Windows應用商店應用,.NET Framework 4及更高版本,SL4和更高版本以及Windows Phone 7和更高版本。當然,我不需要所有這些,但我確實需要.NET 4和Silverlight版本。 API已經可以很好地工作,並且可以自行運行。如果我所有的項目都是未簽名的,但它們不是,那麼也可以與我的申請一起使用。我們爲我們的Silverlight應用程序使用強命名的程序集,以便使用應用程序庫緩存。

無論如何,我有API的源代碼,所以我只是將我的PFX文件添加到項目中來簽名。然後我得到一個錯誤,說明這個API使用的名爲NitoAsnycEx.dll的依賴項沒有被簽名。我沒有Nito.AsyncEx.dll的代碼,但通常情況下這不是這樣的問題,更多的是煩惱。所以現在我有一個古老的問題需要採取我沒有代碼的第三方DLL,並用我的PFX或其他SNK文件簽名。

我可以做或者通常我使用Ian Picknell在這篇文章中精心解釋的過程之一:http://ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html。所以我遵循了這個過程,IL簽名工具似乎簽了DLL就好了。

爲了長話短說,我們使用最簡單的簽名流程版本,我已經準備好了一個簡單的SNK文件。基本上,我這樣做:

  1. 我可以運行ILDASM來獲得文件的.il該第三方EXE:

    ILDASM Nito.AsyncEx.dll /out:Nito.AsyncEx.il

  2. 我可以運行ILASM得到簽名的DLL:

    ILASM Nito.AsyncEx.il/DLL /resource=Nito.AsyncEx.res /key=NPSAssemblyKeyNoPassword.snk

所以,現在

Method Implementations (total): 118 
Resolving local member refs: 0 -> 0 defs, 0 refs, 0 unresolved 
Writing PE file 
Signing file with strong name 
Operation completed successfully 

我有一個簽名的DLL:

它的偉大工程,我得到這樣的結果。我回到我的第三方API代碼,並刪除舊的參考NitoAsyncEx.dll,並把一個新的。我嘗試編譯,然後我得到一個錯誤這樣的:

Error 44 The base class or interface 'System.Object' in assembly 'System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' referenced by type 'Nito.AsyncEx.AsyncLock' could not be resolved r:\Data\GM\Source\GrantManagement\GrantManagement\3rd Party\Nito\Nito.AsyncEx.dll 

我想,這裏存在使用便攜式.NET庫的一些問題,但我不知道它是什麼。對於Silverlight 4+和Full .NET 4.5框架庫,該過程通常適用於我。是否有另一個ILASM或ILDASM設置在某個地方,可以正確拆卸和重新組裝便攜式代碼?這甚至有可能嗎?

我也嘗試去獲取NitoAsyncEx.dll的源代碼,它是開源的btw,然後編譯它,但源代碼不會編譯,因爲它缺少一些文件。因此,目前我一直堅持將此API集成到我的項目中,並需要社區中任何專家的一點幫助。

有沒有辦法正確簽署這個DLL,所以我們不會缺少對System.Object等基本類的引用?

有沒有辦法避免需要簽署此DLL的所有,並從我的項目引用它?

回答

1

修訂

盒子SDK已經更新,現在是強命名上的NuGet。這要歸功於最近對AsyncEx的更新,它強調了程序集。


正如您所提到的,不幸的是,我們不能控制NitoAsyncEx庫沒有強命名。這個庫提供了在異步/等待調用期間正確鎖定資源的能力,而且我不認爲目前有更好的選擇。

這就是說,我可能有一個(希望臨時)的解決方法。我已經從https://nitoasyncex.codeplex.com/下載了源代碼,並能夠編譯它。這是我執行的步驟:

  • 移除了的csproj引用的MSBuild
  • 複製從包文件夾的丟失Dequeue.cs文件
  • 解決缺少的NuGet引用
  • 再生的AssemblyInfo.cs中
  • 從項目
  • 卸載其他所有項目排除.TT模板文件的SDK不使用

這裏所得到的溶液: https://cloud.box.com/s/7ikurtyajqmhq9p8q52x

我已經成功地運行通過SDK的測試結果DLL所以希望這應該涵蓋你所需要的。我不能保證這種方法的穩定性,但有一個工作源可以讓你做任何你需要的簽名。從那裏,你應該能夠將簽名的程序集放到SDK源文件中,並簽署該程序集。

+0

哇,謝謝!我嘗試了大約一半的你列出的東西來獲得Nito.AsnycEx.dll代碼來編譯和許多其他的東西,但不是最終使它工作的東西。這實際上是一個相當體面的工作。看到NitoAsyncEx項目在很長一段時間內根據源代碼沒有更新,我沒有看到它改變太多,如果沒有改變,並且Box繼續使用它,當你更新你的API時,我只會抓住它並嘗試用這個替換Nito參考。 – Doug

+0

我可能會過早地調用它,因爲我簽署並更新了NITO DLL後,我實際上並沒有使用Box API,但我認爲這將是PROP的解決方案。非常感謝你快速轉身,我真的被困在這。作爲供參考的 – Doug

+0

,Box v2 sdk現在在nuget上名列前茅。更新原始帖子以反映此更改。 – letstango

相關問題