2015-11-03 131 views
3

我寫了一個C++類庫在Visual Studio中只定義調用一些Python的函數:你可以在UWP中的C#代碼中使用C++ DLL嗎?

#pragma once 

#include <Python.h> 

extern "C" 
__declspec(dllexport) 
void python() 
{ 
    Py_Initialize(); 
    PyRun_SimpleString("2 + 2"); 
} 

我取得了相同的解決方案,這是一個C#空白通用的應用程序的另一個項目。我試圖引用從前面提到的項目生成的DLL:

using System; 
... 

namespace StartupApp 
{ 
    ... 
    sealed partial class App : Application 
    { 
     private const string CPPPythonInterfaceDLL = @"pathtodll"; 

     [DllImport(CPPPythonInterfaceDLL, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] 
     private static extern void python(); 

     public static void Python() 
     { 
      python(); 
     } 
     ... 
     public App() 
     { 
      ... 

      Python(); 
     } 

     ... 
    } 
} 

該應用程序處於發佈配置。

每當我試着在我的本機上運行的應用程序,它總是給人一個錯誤:

The program '[2272] StartupApp.exe' has exited with code -1073741790 (0xc0000022). 
Activation of the Windows Store app 'ab6a8ef2-1fa8-4cc7-b7b3-fb7420af7dc3_7dk3a6v9mg4g6!App' failed with error 'The app didn't start'. 

所以我的問題是這樣的:我可以引用一個C++類庫從C#UWP項目?或者UWP應用程序的安全性不允許這麼做?

還是因爲Python.h?

編輯:

我建立一個DLL項目和一個運行時組件,它包裹着它的項目,現在我有這樣的錯誤:

類型的異常「系統

'System.DllNotFoundException' occurred in StartupApp.exe but was not handled in user code 

Additional information: Unable to load DLL 'pathtodll': Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 

我添加了一個用戶到DLL的對象名稱爲「Everyone」(我不知道如何給每個人授予權限),但是錯誤仍然出現。

+0

模塊是本地的,並且本地調試當前被禁用。你嘗試啓用本機調試嗎? –

回答

8

首先,UWP不能僅使用DLLImport來使用傳統的C++ dll。

如果您想將傳統C++函數暴露給C#,第一個建議是使用WinRT組件包裝該C++邏輯。然後,您可以通過以下步驟在UWP應用程序中引用此組件:將其添加到項目中,在解決方案資源管理器窗口中打開文件的屬性,並將它們標記爲要包含在應用程序包中的內容。 This post將會有幫助。 This one提供了更詳細的步驟。

如果你想的PInvoke的dll,你可以按照以下步驟(你可以參考這個MSDN post):

  1. 添加的Win32 DLL到您的UWP項目並確保其類型設置爲「內容」

  2. 然後在正確的cs文件中,使用DllImport來PInvoke該dll。

還有一件事:你需要確保你的Python dll沒有在WinRT中使用被禁止的API。你可以使用/ ZW編譯選項來檢查這個DLL。

+0

我使用了第二篇文章。 DllImport需要哪個DLL,DLL通用項目中的DLL或運行時組件中的DLL。和/ ZW一樣:DLL或運行時組件項目(請原諒我的問題,我對.NET不是很熟悉)。 – M3579

+0

我更新了PInvoke用法的帖子。你最好也讀第一篇文章。它解釋了將傳統C++ dll移植到UWP的不同方法。 –

+0

我用新錯誤更新了問題 – M3579