![](/img/trans.png)
[英]Calling a C++ dll (unmanaged code) from a C# windows service (written in managed code)
[英]access unmanaged dll in c++ from two different applications (a c# windows service and a software platform)
我已經花了幾個小時尋找答案,所以我發現,如果我問自己,我最終可以解決我的問題。 首先,描述一下我想做什么: 因此,為了描述上述設計,我有一個用純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.