每日_VS Assembly resolve 程序自定义加载Dll文件

本文介绍如何通过注册AssemblyResolve事件在程序中加载指定目录下的DLL,并详细阐述了实现步骤及代码示例。

程序加载自己定义目录的DLL时,可以注册AssemblyResolve事件,来自己加载。


AppDomain.CurrentDomain.AssemblyResolve += this.OnDomainAssemblyResolve;


private Assembly OnCurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)

{

return LoadAssembly(args.Name);

// System.Reflection.Assembly.LoadFile(fileFullPath);


}


根据一个目录,获取该目录下的所有dll(包含子目录)

string  foldPath ;

if(!Paht.IsPatRooted(foldPath))

{

folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, foldPaht);

}

string[] files = Directory.GetFiles(foldPath,"*.dll",SearchOption.AllDirectories);

foreach(var file in files)

{

string assemblyName = Path.GetFileName(file);

assemblyName = assemblyName.Sustring(0, assemblyName.Length -4);

string assemblyPath = Path.GetFullPath(file);

}



### Qt加载DLL文件的方法及示例 在Qt中,可以通过多种方式加载动态链接库(DLL)。以下是几种常见的方法及其代码示例: #### 方法一:使用 `QLibrary` 动态加载DLL `QLibrary` 是Qt提供的一个类,用于动态加载共享库或DLL。以下是一个完整的示例代码[^1]: ```cpp #include <QCoreApplication> #include <QLibrary> #include <QDebug> typedef int (*FUNC)(int a, int b); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 尝试加载 DLL 并解析函数符号 FUNC myFunc = (FUNC)QLibrary::resolve("Sum.dll", "fnSum"); if (!myFunc) { qDebug() << "Load dll failed!"; return -1; } // 调用 DLL 中的函数 int ret = myFunc(1, 2); qDebug() << "ret:" << ret; return a.exec(); } ``` - 使用 `QLibrary::resolve` 方法加载指定的DLL并解析其中的函数符号。 - 如果解析失败,则返回空指针,并输出错误信息。 #### 方法二:静态链接方式 静态链接是指将DLL生成的`.lib`文件导入到当前工程中。这种方式不需要在运行时动态加载DLL,而是直接调用其中的函数[^2]。 以下是一个静态链接的示例代码: ```cpp #include <QDebug> class IamDLL { public: int add(int a, int b) { return a + b; } }; int DoMult(int a, int b) { return a * b; } int DoDiv(int a, int b) { return a / b; } QString DoLogin(const QString& username, const QString& password) { return "Logged in"; } int main() { qDebug() << "\r\n"; IamDLL _IamDLL; qDebug() << "IamDLL.add : " << _IamDLL.add(121, 123); qDebug() << "DoMult : " << DoMult(12, 12); qDebug() << "DoDiv : " << DoDiv(121, 11); qDebug() << "DoLogin : " << DoLogin("hello", "test").toUtf8().data(); return 0; } ``` - 在此方法中,需要将DLL生成的`.lib`文件添加到项目的`.pro`文件中。 - 直接实例化类或调用函数即可。 #### 方法三:使用 `extern "C"` 导出函数 为了确保C++编写的DLL能够被正确调用,可以使用 `extern "C"` 导出函数。以下是一个简单的DLL导出示例[^3]: ```cpp // DLL中的导出函数 extern "C" { __declspec(dllexport) int avg(int a, int b) { return (a + b) / 2; } } ``` 在主程序中,可以通过 `QLibrary` 加载DLL并解析函数符号: ```cpp #include <QCoreApplication> #include <QLibrary> #include <QDebug> typedef int (*AVG_FUNC)(int a, int b); int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLibrary lib("example.dll"); if (!lib.load()) { qDebug() << "Failed to load DLL!"; return -1; } AVG_FUNC avgFunc = (AVG_FUNC)lib.resolve("avg"); if (!avgFunc) { qDebug() << "Failed to resolve function!"; return -1; } int result = avgFunc(10, 20); qDebug() << "Average:" << result; return a.exec(); } ``` #### 注意事项 1. 确保DLL文件路径正确,或者将其放置在可执行文件所在的目录下。 2. 如果DLL是C++编写的,建议使用 `extern "C"` 导出函数以避免名称修饰问题。 3. 静态链接需要将DLL生成的`.lib`文件添加到项目中,并确保头文件可用[^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr蹇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值