.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使用戶調取不到用戶環境變數,只能調取到系統環境變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/5914.html
標籤:ASP.NET
