我试图在安装过程中在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.dll
和MySql.Data.dll
都{tmp}
在运行时正确提取到目录中。
我尝试了带有和不loadwithalteredsearchpath
带有标志的结果相同。
我发现该错误代码是通用的.NET运行时错误代码。
如果我删除使用MySql.Data
它的零件,效果很好(除了它什么都不做...)
正如在其他线程上所建议的那样,我一直尝试使用EventLog
和在.NET代码中记录错误,UnhandledException
但是无论如何(并且没有创建日志源),即使没有MySQL部分,我也有相同的例外。我在计算机上检查了EventLog权限。
似乎一旦我使用任何其他“基本” C#代码(无论何时尝试加载另一个DLL),就会引发异常。
可能有更好的方法,但是可以做到。
实现一个初始化函数(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] 删除。
我来说两句