如何在C#中卸载C ++ DLL

时间:2011-03-21 22:28:14

标签: c# asp.net c++

我在C#ASP.Net Web应用程序中使用DLLImport加载C ++ DLL。 DLL基本上读取一些CSV文件,并操纵它们并创建新文件。

在我成功运行该方法并再次运行之后,我又回到了C ++异常。

我想从网站上卸载C ++ DLL,以便用户可以重新加载DLL并重新运行该方法。你知道如何消除这个错误或摆脱这个错误消息,以便DLL可以在运行后卸载吗?

3 个答案:

答案 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。

由于这个问题至多存在问题,我想提出一个不同的解决方案:为什么不编写一个单独的命令行程序来完成工作并根据需要运行它。它将在它自己的进程中运行,并在运行后完全卸载。