我想在ASP.NET代碼隱藏DLL中使用一塊Windows 10特定的UWP API(特別是Windows.Graphics.Printing3D的東西)。有沒有辦法做到這一點?ASP.NET中的UWP API
回答
在尋找僅用於.NET的解決方案時,我發現了一種適度乾淨的方式 - 一種Win32/64 C++ DLL,它將使用UWP API並提供基於COM或P/Invoke的接口。淨。
創建一個常規的Win32 DLL。爲.NET構建一個接口來消費 - 導出函數或對象,具體取決於。在我的情況下,一個導出的函數將會執行。在該項目中的C/C++設置,做如下修改:
- 在常規下,設置
Consume Windows Runtime Extensions
到Yes
。在常規 - ,設置
Additional #using Directories
到:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcpackages;C:\Program Files (x86)\Windows Kits\10\UnionMetadata
(假定的Visual Studio 2015年) - 在代碼生成,設置
Enable Minimal Rebuild
到No
(這僅僅是用於調試,而不是發佈)。
然後實例和在通常的C++/CX方式使用UWP部件在DLL,就像您在一個商店應用,經由using namespace Windows::...
和ref new
。
在這種方法中,你失去了位不可知性;非託管DLL不能是「任何CPU」。你贏了一些,你輸了一些。另外,如果沒有系統上的Visual C++可再發行組件包,該站點將不會運行。另一方面,它可能比.NET應用運行得更快;較少的管理/本地邊界交叉口。
打開項目文件作爲XML,並粘貼在第一<PropertyGroup>
以下行:
<TargetPlatformVersion>10.0</TargetPlatformVersion>
一旦你做到這一點,添加引用對話框將包括UWP庫和文件類型選項「瀏覽...「對話框將包含.winmd。
加載項目,做添加引用/瀏覽,找到C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd
,添加。
託管程序集System.Runtime.WindowsRuntime
(例如IBuffer.AsStream()
)中有一些有用的擴展方法,但由於某種原因,它未在「程序集」下列出。要引用它,你需要直接編輯項目文件,並根據第一<ItemGroup>
,添加以下內容:
<Reference Include="System.Runtime.WindowsRuntime" />
不同的是引導各國,你不需要編譯目標更改爲x86或64;任何CPU都可以。
最後,專門針對ASP.NET場景,您必須將當前AppDomain
的LoaderOptimization
策略更改爲SingleDomain。這樣做,最快捷的方式是通過濫用的AppDomain
的私有方法:
AppDomain ad = AppDomain.CurrentDomain;
MethodInfo mi = ad.GetType().GetMethod("SetupLoaderOptimization", BindingFlags.Instance | BindingFlags.NonPublic);
mi.Invoke(ad, new object[] { LoaderOptimization.SingleDomain });
一個很好的做到這一點會在應用程序啓動代碼。
一個稍微不危險的方法將涉及創建一個新的AppDomain,它將繼承當前的所有設置屬性,但LoaderOptimization將設置爲SingleDomain,並在該域中運行UWP相關代碼。像這樣:
AppDomain CreateUnsharingDomain()
{
AppDomain cad = AppDomain.CurrentDomain;
AppDomainSetup cads = cad.SetupInformation;
return AppDomain.CreateDomain("Dummy", cad.Evidence,
new AppDomainSetup
{
ApplicationName = cads.ApplicationName,
ApplicationBase = cads.ApplicationBase,
DynamicBase = cads.DynamicBase,
CachePath = cads.CachePath,
PrivateBinPath = cads.PrivateBinPath,
ShadowCopyDirectories = cads.ShadowCopyDirectories,
ShadowCopyFiles = cads.ShadowCopyFiles,
ApplicationTrust = cads.ApplicationTrust,
LoaderOptimization = LoaderOptimization.SingleDomain
});
//Not sure which other properties to copy...
}
CreateUnsharingDomain().DoCallBack(MyUWPDependentMethod);
同樣,創建一次域並緩存它的應用程序生存期也是有意義的。
在某些情況下它可能會更快;多域優化存在的原因。
靈感:"Walkthrough: Using WinRT libraries from a Windows Desktop application" by David Moore。
- 1. UWP不支持的API
- 2. Asp.NET中的LinkedIN API
- 3. 在UWP c#應用程序中,內部消息總線的C#UWP api
- 4. 的Windows 10 UWP屏幕錄製API
- 5. 使用帶有Qt的UWP API
- 6. UWP中的Delegate.Clone
- 7. UWP中的GridView
- 8. ASP.NET網絡中的ASP.NET Web API
- 9. UWP與uWp中的FindAncestor等效函數
- 10. ASP.NET Web API中的API版本
- 11. WebForms中的ASP.NET Web API 404
- 12. ASP.NET 3.5中的SendGrid Web API
- 13. asp.net中的任何vine api?
- 14. ASP.net API項目中的UI
- 15. ASP.NET Web API - camelcase中的XML
- 16. 在ASP.Net中的Google Weather API
- 17. IE中的ASP.NET Web API
- 18. ASP.NET中的SendGrid事件API
- 19. 爲JsonMediaTypeFormatter中的ASP.NET Web API
- 20. C#中的UWP XmlSerialization
- 21. UWP - ListView.ItemTemplate中的StateTrigger
- 22. SemanticZoom中的UWP ScrollIntoView
- 23. UWP ComboBox中的StackOverflowException
- 24. UWP/XAML C#是否與Spotify API兼容?
- 25. 在UWP應用程序中使用CredentialLocker API的漫遊憑據
- 26. ASP.NET中的Google API中的redirect_uri_mismatch
- 27. 在ASP.NET Web Api中請求「foreign」Api
- 28. UWP在ControlTemplate中
- 29. asp.net MVC3,Facebook的API
- 30. Twitter的API,C#,ASP.Net
這似乎並沒有對2017年VS有關工作的任何人都可以幫助嗎? –
請求一個單獨的問題。 StackOverflow不是一個論壇,沒有人會回答評論。 –