C# 如何卸载C++;C语言中的动态链接库#

C# 如何卸载C++;C语言中的动态链接库#,c#,asp.net,c++,C#,Asp.net,C++,我使用dLLimPART在C++的ASP.NET Web应用程序中加载C++ DLL。DLL基本上读取一些CSV文件,并对其进行操作并创建新文件 成功运行该方法后,再次运行,得到C++异常返回。p> 我想从网站上卸载C++ DLL,这样用户就可以重载DLL并重新运行该方法。您知道如何消除此错误或删除此错误消息,以便DLL在运行后可以卸载吗?据我所知,无法使用C进行后期绑定 你可以通过创建一个C++ DLL来使用它。假定您对C++的了解足够多,您只需要一个由DLL导出的函数,它使用 LoadLib

我使用dLLimPART在C++的ASP.NET Web应用程序中加载C++ DLL。DLL基本上读取一些CSV文件,并对其进行操作并创建新文件

成功运行该方法后,再次运行,得到C++异常返回。p>


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

据我所知,无法使用C进行后期绑定

<>你可以通过创建一个C++ DLL来使用它。假定您对C++的了解足够多,您只需要一个由DLL导出的函数,它使用<代码> LoadLibrary < /C> >加载您的CSV操作DLL,<代码> GePosiTrave>代码>检索您要调用的函数的地址,然后<代码> FreeLibrary < /C> >释放库。 例如:

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函数被多次调用的问题所在,并加以解决。

据我所知,没有办法使用C进行后期绑定

<>你可以通过创建一个C++ DLL来使用它。假定您对C++的了解足够多,您只需要一个由DLL导出的函数,它使用<代码> LoadLibrary < /C> >加载您的CSV操作DLL,<代码> GePosiTrave>代码>检索您要调用的函数的地址,然后<代码> FreeLibrary < /C> >释放库。 例如:

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函数的问题所在,并加以解决。

根据我的信息,非托管DLL始终加载到主应用程序域中。如果不是这样,您将能够以这种方式卸载DLL


既然这充其量是有问题的,我想提出一个不同的解决方案:为什么不编写一个单独的命令行程序来完成这项工作并根据需要运行它呢。它将在自己的进程中运行,并在运行后完全卸载。

根据我的信息,非托管DLL始终加载到主应用程序域中。如果不是这样,您将能够以这种方式卸载DLL


既然这充其量是有问题的,我想提出一个不同的解决方案:为什么不编写一个单独的命令行程序来完成这项工作并根据需要运行它呢。它将在自己的进程中运行,并在运行后完全卸载。

如果是您的代码。。。为什么不提供一个
免费资源
功能呢


作为替代方案,修复代码以使函数重新进入也会起作用

如果是你的代码。。。为什么不提供一个
免费资源
功能呢


作为替代方案,修复代码以使函数重新进入也会起作用

它说[SEHExtRebug(0x800 0400):外部组件抛出了异常。]异常细节:Stury.RunTime.InopService。SEHExtEx:ExtPultEngices抛出异常。这里放C++代码。可能它的逻辑有内存泄漏或问题!您不需要从内存中卸载任何
DLL
,因为
DLL
文件可以在同一时间从多个应用程序访问。代码非常庞大。基本上我有全局变量,在其中我加载CSV文件,我读取三个CSV文件,从几个列中获取一些值,进行一些计算,并将数据写入另一个文件。我希望类级别的变量必须从内存中删除,CSV文件必须在它们的作用域(即类的最后一个括号)之后释放。也许我用C++ CPLEX读取CSV文件,但是在我读了它们之后,我并没有关闭或释放文件。你知道如何在C++ C++中发布文件吗?它说[SEHExtRebug(0x8000 045):外部组件抛出了一个异常。]异常细节:Stase.RunTime.InopService。SeHeExc:外部组件抛出了一个异常。这里放C++代码。可能它的逻辑有内存泄漏或问题!您不需要从内存中卸载任何
DLL
,因为
DLL
文件可以在同一时间从多个应用程序访问。代码非常庞大。基本上我有全局变量,在其中我加载CSV文件,我读取三个CSV文件,从几个列中获取一些值,进行一些计算,并将数据写入另一个文件。我希望类级别的变量必须从内存中删除,CSV文件必须在它们的作用域(即类的最后一个括号)之后释放。也许我用C++ CPLEX读取CSV文件,但是在我读了它们之后,我并没有关闭或释放文件。你知道如何在C++中释放文件吗?如果C++在进程中锁定文件,如果我调用FrielBryRead方法,它也会释放锁文件,释放C++ DLL吗?只有当dll中的卸载代码显式关闭文件句柄时,我的初步猜测是它不会释放任何资源;DLL可能已将句柄传递回加载程序。不过,我不完全确定。有人可能知道更好。你是说我需要添加一个析构函数并添加代码释放?如果C++在其进程中锁定文件,如果我调用FielBryRayes方法,它也会释放锁文件,释放C++ DLL吗?只有当dll中的卸载代码显式关闭文件句柄时,我的初步猜测是它不会释放任何资源;DLL可能已将句柄传递回加载程序。不过,我不完全确定。有人可能知道更好。你的意思是我需要添加一个析构函数并添加代码在那里?所以你建议我调用C++ DLL的方法