Dot-Net
如何從 Inno Setup 腳本呼叫 .NET DLL?
我想從 Inno Setup 腳本呼叫 .NET DLL(用 C# 編碼)中的函式。
我有:
- 在項目屬性中標記了Register for COM interop選項,
- 更改了AssemblyInfo.cs文件中的ComVisible設置,
- 將這些行添加到 ISS 腳本中:
$$ Files $$ 來源:c:\temp\1\MyDLL.dll;標誌:不要複製
$$ Code $$ 函式 MyFunction(): 字元串;
外部’MyFunction@files:MyDLL.dll stdcall setuponly';
但我仍然收到以下錯誤:
執行時錯誤(-1:0):
無法導入 dll:C:\DOCUME~1\foo\LOCALS~1\Temp\is-LRL3E.tmp\MyDLL.dll。
我究竟做錯了什麼?
哎呀,我的錯,我已經很久沒有讀過帕斯卡了!因此,如果您需要獲得價值,那麼有幾種可能性:
- 用 C/C++ 編寫函式並導出函式,這絕對是支持的。
- 使用託管 C++ dll 填充到您的 .NET dll,並將呼叫公開為 C 介面點(這應該可以工作,但它會變得混亂)
- 使用 .exe 將程式碼的結果儲存在 .INI 文件或系統資料庫或臨時文件中,並在安裝程式碼部分讀取結果(這現在很討厭)
當我上次使用 InnoSetup 時,它不直接支持您的方案(從設置中呼叫 .NET 程式碼)。
試試這個方法:
Var obj: Variant va: MyVariableType; Begin //Starting ExtractTemporaryFile('MyDll.dll'); RegisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False); obj := CreateOleObject('MyDll.MyClass'); //Using va := obj.MyFunction(); //Finishing UnregisterServer(False, ExpandConstant('{tmp}\MyDll.dll'), False); DeleteFile('{tmp}\MyDll.dll'); End;運氣