2016-11-15 83 views
1

我想在ASP.NET代碼隱藏DLL中使用一塊Windows 10特定的UWP API(特別是Windows.Graphics.Printing3D的東西)。有沒有辦法做到這一點?ASP.NET中的UWP API

回答

0

在尋找僅用於.NET的解決方案時,我發現了一種適度乾淨的方式 - 一種Win32/64 C++ DLL,它將使用UWP API並提供基於COM或P/Invoke的接口。淨。

創建一個常規的Win32 DLL。爲.NET構建一個接口來消費 - 導出函數或對象,具體取決於。在我的情況下,一個導出的函數將會執行。在該項目中的C/C++設置,做如下修改:

  • 在常規下,設置Consume Windows Runtime ExtensionsYes。在常規
  • ,設置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 RebuildNo(這僅僅是用於調試,而不是發佈)。

然後實例和在通常的C++/CX方式使用UWP部件在DLL,就像您在一個商店應用,經由using namespace Windows::...ref new

在這種方法中,你失去了位不可知性;非託管DLL不能是「任何CPU」。你贏了一些,你輸了一些。另外,如果沒有系統上的Visual C++可再發行組件包,該站點將不會運行。另一方面,它可能比.NET應用運行得更快;較少的管理/本地邊界交叉口。

靈感:"Using C++/CX in Desktop apps" by Pavel Y.

+0

這似乎並沒有對2017年VS有關工作的任何人都可以幫助嗎? –

+0

請求一個單獨的問題。 StackOverflow不是一個論壇,沒有人會回答評論。 –

0

打開項目文件作爲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場景,您必須將當前AppDomainLoaderOptimization策略更改爲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