在Inno安装程序中调用.NET DLL

在Inno安装程序中调用.NET DLL,.net,dll,inno-setup,.net,Dll,Inno Setup,我正试图将一个用C#编写的DLL加载到Inno安装程序中 代码如下: 函数检查(版本,目录:字符串):整数; 外部“Check@{src}\Check.dll stdcall”; 然后我把它叫做Check(x,y) 但无法加载DLL 我用stdcall和cdecl试过了 check.dll文件随附于setup.exe 为什么不起作用 我认为这是不可能的。托管DLL不直接导出函数。从InnoSetup调用DLL需要直接导出函数 当试图从C++中使用托管DLL时,问题是相同的。如前所述,除非使用C

我正试图将一个用C#编写的DLL加载到Inno安装程序中

代码如下:

函数检查(版本,目录:字符串):整数;
外部“Check@{src}\Check.dll stdcall”;
然后我把它叫做
Check(x,y)

但无法加载DLL

我用
stdcall
cdecl
试过了

check.dll
文件随附于
setup.exe


为什么不起作用

我认为这是不可能的。托管DLL不直接导出函数。从InnoSetup调用DLL需要直接导出函数

当试图从C++中使用托管DLL时,问题是相同的。如前所述,除非使用COM,否则无法执行此操作

您应该使用本机Win32 DLL。

看看Robert Giesecke的文章

使用从C#程序集导出函数,以便在Inno设置中调用该函数

  • 在C中实现一个静态方法#
  • 将NuGet包添加到项目中
  • 将项目的平台目标设置为x86
  • DllExport
    属性添加到方法中
  • 如果需要,为函数参数定义封送处理(特别是必须定义字符串参数的封送处理)
  • 建造
在Inno安装端(Unicode版本):

[文件]
资料来源:“MyNetDll.dll”;标志:dontcopy
[守则]
函数RegexMatch(模式:string;输入:string):布尔;
外部的RegexMatch@files:MyNetDll.dll stdcall';
现在您可以使用您的功能:

如果RegexMatch('[0-9]+','123456789'),则
开始
日志(“匹配”);
结束
其他的
开始
日志(“不匹配”);
结束;

另见:

我只是使用一个批处理文件(在CMD控制台中触发命令)来注册dll,就像我一个一个地注册一样:@echo-off-echo-registing-DevExpress-dll%~dp0gacutil.exe/I%~dp0DevExpress.BonusSkins.v12.1.dll%~dp0gacutil.exe/I%~dp0DevExpress.Charts.v12.1.Core.dll,因此,我将其放在iss脚本的运行部分:[运行]文件名:C:\myFolder\RegisterDevXpress.bat“希望这有帮助。
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace MyNetDll
{
    public class MyFunctions
    {
        [DllExport(CallingConvention = CallingConvention.StdCall)]
        public static bool RegexMatch(
            [MarshalAs(UnmanagedType.LPWStr)]string pattern,
            [MarshalAs(UnmanagedType.LPWStr)]string input)
        {
            return Regex.Match(input, pattern).Success;
        }
    }
}