【发布时间】: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