簡體   English   中英

從兩個不同的應用程序(ac#Windows服務和一個軟件平台)訪問c ++中的非托管dll

[英]access unmanaged dll in c++ from two different applications (a c# windows service and a software platform)

我已經花了幾個小時尋找答案,所以我發現,如果我問自己,我最終可以解決我的問題。 首先,描述一下我想做什么: 打包的DLL和軟件平台需要共享未經管理的代碼 因此,為了描述上述設計,我有一個用純c ++編寫的.dll插件(我不希望它包含任何.Net代碼)。 該c ++插件將在軟件平台上使用。 現在,我希望c#Windows服務能夠與軟件平台進行交互,但是它只能通過c ++ dll來完成。 因此,我將c ++插件的所有功能包裝到Wrapped Dll中(導出了功能),並且將Wrapped Dll使用到了c#windows服務中。

現在,我有一個測試方法來檢查c ++功能的導出是否正常(只是返回兩個整數之和的簡單方法),並且我可以看到Windows服務可以與c ++中非托管dll相互干擾。正確的方法,我得到正確的結果。 我遇到的問題是,當我嘗試通過c ++非托管dll與軟件平台進行交互時。 我收到以下錯誤:

錯誤的內存損壞

我意識到該錯誤應該是由於非托管dll無法同時由Software Platform和Wrapped Dll訪問。 為了解決這個問題,我發現解決方案是在GAC中添加非托管dll。 但是要將dll放入GAC中,該dll必須具有一個強名稱,但是我發現除非啟用了/ clr選項,否則我無法對非托管代碼簽名一個強名稱。 但是,當我啟用此選項時,非托管dll無法編譯。

總而言之,有什么方法可以讓我的非托管dll被軟件平台和包裝的dll訪問? 沒有在我的非托管代碼中集成.Net?

我已經花了很多時間來尋找解決方案,所以如果你們中的任何一個能給我一些啟示的話,那就太好了!

謝謝

您的非托管dll及其所有依賴項必須與應用程序(.exe)位於同一文件夾中。 您不需要GAC。 如果要將dll存儲在其他位置,請使用:

p(調用:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool AddDllDirectory(string lpPathName);

在應用程序啟動時:

if (System.Environment.OSVersion.Version.Major > 5)
{
    AddDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}
else
{
    SetDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}

另外,請確保不要混淆x86和x64 architexture。 此外,請確保您使用的是正確的CallingConvention。 一個很好的例子是: 未處理的異常:System.AccessViolationException:嘗試讀取或寫入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM