Inno Setup-具有依赖项的外部.NET DLL

工厂员工

我试图在安装过程中在Inno Setup脚本中使用自定义DLL。我编写了一个非常简单的函数,该函数基本上使用MySQL .NET连接器检查MySQL数据库的连接字符串(目标服务器上没有MySQL客户端)。此导出函数的代码为:

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 'CheckConnexion@files:MyDll.dll,MySql.Data.dll stdcall setuponly loadwithalteredsearchpath';`

问题是安装程序在运行时引发异常:

运行时错误(位于53:207):

外部异常E0434352。

我认为我必须使用files前缀,因为在将NextButtonClick文件复制到{app}目录之前,该函数在事件处理程序中被调用

两者MyDll.dllMySql.Data.dll{tmp}在运行时正确提取到目录中。

我尝试了带有和不loadwithalteredsearchpath带有标志的结果相同。

我发现该错误代码是通用的.NET运行时错误代码。

如果我删除使用MySql.Data的零件,效果很好(除了它什么都不做...)

正如在其他线程上所建议的那样,我一直尝试使用EventLog在.NET代码中记录错误UnhandledException但是无论如何(并且没有创建日志源),即使没有MySQL部分,我也有相同的例外。我在计算机上检查了EventLog权限。

似乎一旦我使用任何其他“基本” C#代码(无论何时尝试加载另一个DLL),就会引发异常。

马丁·普里克里(Martin Prikryl)

可能有更好的方法,但是可以做到。

实现一个初始化函数(Init此处),该函数设置AppDomain.AssemblyResolve处理程序以在主(执行)程序集的路径中查找程序集:

[DllExport("Init", CallingConvention.StdCall)]
public static void Init()
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
}

private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
    string location = Assembly.GetExecutingAssembly().Location;
    AssemblyName name = new AssemblyName(args.Name);
    string path = Path.Combine(Path.GetDirectoryName(location), name.Name + ".dll");
    if (File.Exists(path))
    {
        return Assembly.LoadFrom(path);
    }
    return null;
}

将其导入到Inno Setup:

procedure Init(); external 'Init@files:MyDll.dll stdcall setuponly';

并在调用需要依赖项的函数(CheckConnexion之前对其进行调用


另一个解决方案可能是:将
DLL嵌入已编译的可执行文件中


顺便说一句,不需要loadwithalteredsearchpath标志。它对.NET程序集imo没有影响。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过回调从Inno Setup调用C#DLL

Inno Setup中的“ java -version”命令具有不同的结果

Inno Setup提示外部文件位置

Inno Setup检查外部应用程序的版本

Inno Setup排除目录及其中的所有内容

Inno Setup tmp被阻止

如何在Inno Setup iss文件中添加DLL函数?

在Inno Setup中检索.NET程序集的强名称

如何使用Windows Shell32.dll中的图标作为Inno Setup快捷方式

Inno Setup 6不能在字符串参数中使用DLL函数,而可以在Inno Setup 5中使用

在Inno Setup窗口中打开外部程序

在Inno Setup的[Code]部分中,可以使用64位DLL吗?

Inno Setup中的#emit指令有什么意义?

在Inno Setup中使用“ signonce”标志有什么意义?

在Inno Setup中加载具有依赖项的DLL在带有“无法导入DLL”的卸载程序中失败,但在安装程序中有效

Inno Setup 32位和64位dll安装

从具有托管输出的C#DLL返回字符串到Inno Setup脚本

如何在Inno Setup中将VCL样式应用于基于DLL的表单?

Inno Setup:将DLL放在子目录中

在Inno Setup中加载用于卸载过程的外部DLL

Inno Setup如何检查系统上是否存在MSVCR100.dll

使用 Inno Setup 安装程序安装 Windows shell 扩展 DLL

Inno Setup:用于 C# DLL 中冗长同步操作的 Marquee 样式进度条

Inno Setup 以字符串为参数调用 DLL

VBA - ActiveX 无法为具有依赖项的 .net dll 创建对象

使用函数在 Inno Setup 中填充的已分配字符缓冲区调用 DLL 函数

Inno Setup“外部”子句是否负责加载和上传?

Inno Setup:从现有文件中删除写保护

如何使用 DNNE 从 Inno Setup 调用 .NET DLL?