.net C#調用C++ dll 主要分為以下的步驟 1、載入dll [DllImport("CallOtherLanguage.dll", EntryPoint = "create_prg", CharSet = CharSet.Unicode, CallingConvention = Calli ...
.net C#調用C++ dll 主要分為以下的步驟
1、載入dll
[DllImport("CallOtherLanguage.dll", EntryPoint = "create_prg", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] private static extern int create_prg(byte[] first_num, byte[] second_num);
2、調用dll
public void CallOther() { string first = "this is a "; byte[] byteFirst = Encoding.UTF8.GetBytes(first); string second = "other"; byte[] byteSecond = Encoding.UTF8.GetBytes(second); int result = create_prg(byteFirst, byteSecond); Console.WriteLine(result); }
遇到的問題
1、調用dll時報:無法載入*.dll,找不到指定的模塊
這個主要有以下兩個原因
a、是因為對應的dll中有依賴於別的dll,用【depends】這個程式打開dll看有哪些依賴dll沒有於當前dll放到同一個目錄下,下載指定的dll到當前目錄下即可
b、dll依賴的dll所在的路徑沒有放到環境變數中,把依賴dll放到環境變數中此錯誤就會解決
2、控制台程式和winform程式調用dll都能夠正確返回內容,便是webform或webservice調用dll就會報錯:未處理System.StackOverflowException
這個目前瞭解到的原因是控制台程式和winform中單線程調用,而webform或webservice是多線程調用,可能是這方面出現的問題,以下是兩個臨時解決方案
1、寫一個控制台程式調用dll,然後weborm調用這個控制台程式獲得返回結果
2、把webform的請求寫入資料庫或隊列中,然後寫一個服務自動去輪詢資料庫或隊列進行處理
2、vs調試時調用正常,便是發佈到IIS後調用失敗,說找不到指定的模塊:無法載入*.dll,找不到指定的模塊
這個問題主要是因為調用的dll所依賴的dll所在路徑配置的環境變數是用戶環境變數而不是系統環境變理,把環境變數配置到系統環境變數後問題解決
原因是IIS使用戶調取不到用戶環境變數,只能調取到系統環境變數