我在C#ASP.Net Web应用程序中使用DLLImport加载C ++ DLL。 DLL基本上读取一些CSV文件,并操纵它们并创建新文件。
在我成功运行该方法并再次运行之后,我又回到了C ++异常。
我想从网站上卸载C ++ DLL,以便用户可以重新加载DLL并重新运行该方法。你知道如何消除这个错误或摆脱这个错误消息,以便DLL可以在运行后卸载吗?
答案 0 :(得分:2)
据我所知,没有办法用C#进行后期绑定。
但是,您可以通过创建C ++ DLL并使用它来实现。假设你对C ++有足够的了解,你只需要一个DLL导出的单个函数,它使用LoadLibrary
加载你的CSV操作DLL,GetProcAddress
来检索你想要的函数的地址调用,然后FreeLibrary
释放库。
一个例子是:
extern "C" {
__declspec(dllexport) bool InvokeMyFunction() {
HMODULE lib = LoadLibrary("csvlib.dll");
if (!lib)
return false;
void (*func)(int) = (void (*)(int))GetProcAddress(lib, "MyCsvFunc");
if (!func)
return false;
func(5);
FreeLibrary(lib);
return true;
}
}
但这并不完全安全。如果可能的话,最好找出你的DLL函数被多次调用的问题,并修复它。
答案 1 :(得分:1)
如果是您的代码......为什么不提供FreeResources
功能?
作为替代方案,修复代码以使您的函数可重入也是有效的。
答案 2 :(得分:0)
根据我的信息,非托管DLL始终加载到主应用程序域中。如果不是,您将能够以这种方式卸载DLL。
由于这个问题至多存在问题,我想提出一个不同的解决方案:为什么不编写一个单独的命令行程序来完成工作并根据需要运行它。它将在它自己的进程中运行,并在运行后完全卸载。