我想在安裝期間在Inno安裝腳本中使用自定義DLL。我寫了一個非常簡單的函數,它基本上使用MySQL .NET連接器檢查MySQL數據庫的連接字符串(目標服務器上沒有MySQL客戶端)。這個導出函數的代碼是:Inno安裝程序 - 依賴關係的外部.NET DLL
public class DbChecker
{
[DllExport("CheckConnexion", CallingConvention.StdCall)]
public static int CheckConnexion([MarshalAs(UnmanagedType.LPStr)] string connexionString)
{
int success;
try
{
MySqlConnection connection = new MySqlConnection(connexionString);
connection.Open();
connection.Close();
success = 0;
}
catch (Exception)
{
success = 1;
}
return success;
}
}
功能導入這樣的Inno Setup的:
[Files]
Source: "..\..\MyDll\bin\x86\Release\*"; Flags: dontcopy;
和
[Code]
function CheckConnexion(connexionString: AnsiString): Integer;
external '[email protected]:MyDll.dll,MySql.Data.dll stdcall setuponly loadwithalteredsearchpath';`
的問題是,設置拋出異常的運行時間:
運行時錯誤(at 53:207):
外部異常E0434352。
我想我必須使用files
前綴,因爲函數被調用在NextButtonClick
事件處理程序,之前的文件複製到{app}
目錄。
在運行時將MyDll.dll
和MySql.Data.dll
都正確提取到{tmp}
目錄。
我試着用和不用loadwithalteredsearchpath
標誌都有相同的結果。
我發現這個錯誤代碼是一個通用的.NET運行時錯誤代碼。
如果我刪除使用MySql.Data
它工作完全正常(除了它什麼也不做......)
誠如其他線程上我一直在試圖將錯誤使用EventLog
我的.NET代碼的一部分和UnhandledException
,但是無論什麼(也沒有創建日誌源),我都有相同的異常,即使沒有MySQL部分也是如此。我在我的電腦上檢查了EventLog權限。
看來,只要我使用其他任何「基本」C#代碼(每當我嘗試加載另一個DLL)時,都會拋出異常。
CheckConnexion在NextButtonClick事件處理程序中調用。 如果我沒有使用'MySql.Data'的第二個函數,它正在工作。純粹的參考似乎不是問題。 – tvarnier
使用'File.WriteAllLines',調用沒有引用'MySql.Data'的函數,記錄並正確返回。使用'MySql.Data'的人在沒有記錄任何東西的情況下仍然以相同的方式失敗。 – tvarnier
由於引用,'MySql.Data' dll被複制到'MyDll'的bin目錄中。整個目錄導入到我的原始文章中描述的'[files]'部分。 我可以在運行時看到在Inno-Setup臨時目錄中提取的'MySql.Data.dll'和'MyDll.dll'。 – tvarnier