UWP 為WinRT元件建立Nuget包

2021-09-30 01:25:39 字數 2255 閱讀 4827

nuget 是 dotnet 開發中必不可少的包管理工具,但不僅僅侷限於 dotnet 專案,在 vs 中使用 c++ 開發的時候,也可以使用 nuget 來引用第三方元件。同樣也可以用 nuget 把 native 的一些元件打包,提供給自己或者別人使用。

這片博文記錄一下如何把 winrt 元件打包成 nuget 包,供 uwp 專案使用。

之前提供給合作夥伴我們的 winrt 元件時,是直接把 .winmd檔案 和 .dll檔案發給他們,其中 .winmd 提供宣告,.dll 提供具體的實現。然後使用者就可以手動引用和複製這兩個檔案到專案裡面使用。

但通過 nuget 包的形式,一方面便於管理和發布,另一方面可以很好的做到版本控制。

實戰如下:

好看的** www.shupu.org主要包含命名空間,類之類的宣告,因為本質上使用的是 com 技術,所以即使只新增對 .winmd 的引用,uwp 專案依舊可以成功編譯。

包含對應 .winmd 的具體 com 實現。

可以使用如下命令來生成乙個名為 demo.nuspec 的模板檔案

nuget spec demo
在此檔案中,需要加入對 demo.winmd 和 demo.dll 檔案的引用,修改完成後如下

<?xml version="1.0"?>

com.cq.nugetdemo

1.0.0.0

nuget demo

cqcq

false

just a test

summary of changes made in this release of the package.

demo

metadata 節點提供一些必要的 nuget 包資訊宣告,最重要的是 id,這個要保證唯一性。

引用檔案的位置是以 demo.nuspec 檔案的位置為基準,可以使用相對路徑。

需要將 nuget.winmd 檔案放入 lib 資料夾下的 uap10.0 目錄,其中 lib 資料夾會在最終生成的 nuget 包中建立,uap10.0 代表此檔案只會被 uwp 應用引用。

需要將 demo.dll 檔案放入 runtimes 資料夾下,同樣這個資料夾我們不需要手動建立,它會在最終生成的 nuget 包**現。win10-x64 代表該 dll 為 x64 cpu 架構,win10-x86 就代表32位,native 則表示此 dll的型別。

com.cq.nugetdemo.targets 檔案和 demo.nuspec 檔案在同一目錄,它主要是為了讓 c++ 的 uwp 專案也能正確新增對 nuget 包中 dll 和 winmd 檔案的引用,在 c# 專案裡面ide會幫我們新增。 該檔案如下:

<?xml version="1.0" encoding="utf-8"?>

x86 $(platform)

demo.dll

雖然 c# 的 uwp 專案不需要 .targets 檔案,但是為了讓 ide 能正確新增對 dll 檔案的引用,我們需要保持 dll 和 winmd 檔案同名,否則在執行時會丟擲異常。在編譯時,會有如下警告:

nuget.exe pack nugetdemo.nuspec -version 1.0.0.3
在建立的時候,可以指定版本號,這方便我們用自動化指令碼來生成 nuget 包。執行此命令後,在demo.nuspec 同級目錄下會生成對應的 .nupkg。

正常使用 nuget 包時,可以通過 vs 裡的 nuget 包管理器去安裝。但是如果我們的 nuget 包只想本地使用,那我們可以給 nuget 包管理器新增乙個本地的包源,

在 .sln 同級目錄,建立乙個 nuget.config 檔案,然後可以在裡面配置本地的 nuget source

<?xml version="1.0" encoding="utf-8"?>

其中 mylocalsource 是包源的名稱,.\nugetpackage 是包源的路徑,也是相對路徑

現在就可以在包管理器中選擇對應的本地源,然後安裝生成的 .nupkg

微軟文件會更加全面一些,而這篇部落格主要是我的具體實踐,對比該文件去掉了一些 暫時沒發現有什麼用 的步驟,新增了一些值得注意的點。

事實上在 demo.dll 是乙個 com 伺服器,使用前需要先註冊,在 uwp 專案裡如何註冊這個 com 伺服器呢?

nuget.dll

為UWP應用開啟回環訪問許可權

原文 為uwp應用開啟回環訪問許可權 最近在專案中遇到uwp呼叫wcf的需求,考慮到uwp不能寄宿wcf服務 如果能,或者有類似技術,請告知 於是寫了乙個wpf程式寄宿wcf服務,然後再用uwp呼叫服務。寫的時候並沒有碰到什麼問題,直到我把uwp打包,連同wpf那個程式部署到另一台機器上去,然後就發...

第二十五章 與WinRT元件互操作

目錄 clr投射與winrt元件型別系統規則 框架投射 用c 定義winrt元件 windows 執行時 元件的目的是公開作業系統最擅長的事情,就是對硬體和跨應用程式的功能進行抽象。所以大多數winrt元件都只是公開了功能,比如儲存,聯網,圖形,安全性,執行緒處理等。winrt元件內部作為 元件物件...

為Unity元件編寫擴充套件

這幾行 寫到乙個editor檔案中,就可以在滑鼠選中某個遊戲物件時,列印出它的路徑,let me show you the code using unityengine using unityeditor using system.collections public class toolkit e...