【问题标题】:C# VisualStudio 2012 - FreeLibrary() blocks the applicationC# Visual Studio 2012 - Free Library() 阻止应用程序
【发布时间】:2014-02-07 08:22:11
【问题描述】:

我在 3 个 DLL 上的 C# 中使用 DLLImport LoadLibrary() 和 FreeLibrary()。
我可以毫无问题地加载 3 DLL,但在我使用 FreeLibrary 的应用程序结束时,它不会更进一步,我必须手动停止它。

这是一个 WPF 应用程序,我必须调用这 3 个 DLL,因为它们需要彼此。我无法使用“添加引用”来添加 DLL。

代码如下:

public partial class MainWindow : Window
{

    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);

    public MainWindow()
    {
        InitializeComponent();
        try
        {
            string pathDllOne = "dll/DllOne.dll";
            string pathDllTwo = "dll/DllTwo.dll";
            string pathDllThree = "dll/DllThree.dll";

            IntPtr DllThreeLink = LoadLibrary(pathDllThree);
            IntPtr DllTwoLink = LoadLibrary(pathDllTwo); 
            IntPtr DllOneLink = LoadLibrary(pathDllOne);

            if (DllOneLink == IntPtr.Zero || DllTwoLink == IntPtr.Zero || DllThreeLink == IntPtr.Zero)
                Console.WriteLine("WARNING : UNABLE TO FIND ONE OR MORE DLL");
            else
                Console.WriteLine("LOADING OK");

            FreeLibrary(DllThreeLink);
            FreeLibrary(DllTwoLink);
            FreeLibrary(DllOneLink);

            Console.WriteLine("END");                
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR : " + ex.Message);
        }
    }
}

控制台清楚地显示“LOADING OK”。
当我调用“FreeLibrary(DllOneLink);”时,问题就发生了。它不会走得更远,因此不会显示“END”消息。
您知道是什么原因造成的吗?

【问题讨论】:

  • FreeLibrary 调用的返回码是什么?您还可以通过单步执行程序将其缩小到导致该问题的调用。
  • 在调试器中运行您的应用程序,并在“挂起”时中断进程。然后查看进程中的线程堆栈,了解它们在等待什么。 FreeLibrary 可能会导致死锁,因为它获取了一个临界区,如果 DLL 的 DllMain 然后等待只有在锁被释放后才会发生的事情,那么你就有了死锁。如果您打算只在即将退出进程时调用FreeLibrary,则无需这样做,因为无论如何都会释放一切。
  • 当我一步一步运行应用程序时,它总是会做第一个和第二个FreeLibrary,但它总是会停在第三个(不管是哪个DLL,它总是最后一个)一)。如果我不使用 FreeLibrary,我会收到 ArithmeticException。

标签: c# wpf visual-studio-2012 dllimport loadlibrary


【解决方案1】:

也许当您执行 LoadLibrary 时,某些资源会加载到库中,而当您执行 FreeLibrary 时,它会挂起,因为库无法卸载,因为此类资源仍在使用中。

也许这些库在调用FreeLibrary之前有一个方法来释放它们的资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多