Dot-Net

如何從 Inno Setup 腳本呼叫 .NET DLL?

  • August 28, 2019

我想從 Inno Setup 腳本呼叫 .NET DLL(用 C# 編碼)中的函式。

我有:

  1. 在項目屬性中標記了Register for COM interop選項,
  2. 更改了AssemblyInfo.cs文件中的ComVisible設置,
  3. 將這些行添加到 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。

我究竟做錯了什麼?

哎呀,我的錯,我已經很久沒有讀過帕斯卡了!因此,如果您需要獲得價值,那麼有幾種可能性:

  1. 用 C/C++ 編寫函式並導出函式,這絕對是支持的。
  2. 使用託管 C++ dll 填充到您的 .NET dll,並將呼叫公開為 C 介面點(這應該可以工作,但它會變得混亂)
  3. 使用 .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;

運氣

引用自:https://stackoverflow.com/questions/45510