使用 64 位 class 库时的 Inno Setup 'Could not call proc'
Inno Setup 'Could not call proc' when using 64-bit class library
Inno Setup 版本 5.6.1(u)。
Dev Studio 2015 64 位 class 库。
.NET Framework 4.6.1
使用 UnamanagedExports 包。
这是脚本:
[Setup]
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
[Files]
Source: "DotNet64.dll"; Flags: dontcopy
[Code]
function TestFunction(): Boolean;
external 'Testing@files:DotNet64.dll stdcall setuponly delayload';
procedure CurPageChanged(CurPageID: Integer);
var
ires : Boolean;
begin
if CurPageID = wpWelcome then begin
ires := TestFunction();
end;
end;
这是 C# DLL 代码
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace DotNet64
{
public class InnSetDLL
{
[DllExport("Testing", CallingConvention = CallingConvention.StdCall)]
public static bool Testing()
{
return false;
}
}
}
一旦在脚本中调用 TestFunction()
,我就会弹出一个窗口:
Runtime Error (at 2:55): Could not call proc.
DotNet64.dll 是否编译为 64 位 DLL?根据 documentation,InnoSetup 无法访问 64 位 DLL。您可以将其编译为 32 位 DLL 或编写调用 64 位 DLL 并执行 64 位 EXE 的 64 位 EXE。
Inno Setup 版本 5.6.1(u)。
Dev Studio 2015 64 位 class 库。
.NET Framework 4.6.1
使用 UnamanagedExports 包。
这是脚本:
[Setup]
ArchitecturesInstallIn64BitMode=x64
ArchitecturesAllowed=x64
[Files]
Source: "DotNet64.dll"; Flags: dontcopy
[Code]
function TestFunction(): Boolean;
external 'Testing@files:DotNet64.dll stdcall setuponly delayload';
procedure CurPageChanged(CurPageID: Integer);
var
ires : Boolean;
begin
if CurPageID = wpWelcome then begin
ires := TestFunction();
end;
end;
这是 C# DLL 代码
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using Microsoft.Win32;
namespace DotNet64
{
public class InnSetDLL
{
[DllExport("Testing", CallingConvention = CallingConvention.StdCall)]
public static bool Testing()
{
return false;
}
}
}
一旦在脚本中调用 TestFunction()
,我就会弹出一个窗口:
Runtime Error (at 2:55): Could not call proc.
DotNet64.dll 是否编译为 64 位 DLL?根据 documentation,InnoSetup 无法访问 64 位 DLL。您可以将其编译为 32 位 DLL 或编写调用 64 位 DLL 并执行 64 位 EXE 的 64 位 EXE。