【发布时间】:2014-02-10 12:56:26
【问题描述】:
我正在使用 Visual Studio 2012 和 C# WPF 应用程序。
我实际上是在尝试加载 3 个 DLL,然后卸载它们。我必须这样做,因为我无法将这些 DLL 添加为对我的 C# 项目的引用。
问题是我不断收到这些 DLL 的 ArithmeticException。我需要所有这些,因为 dll1 需要 dll2 和 dll3 才能正常运行。
我已经一步一步地执行了我的代码,这就是发生的事情:
我的 LoadLibrary() 确实找到了所有的 DLL。一旦我到达 FreeLibrary(),就没有错误,但在我的代码结束时(确切地说,当离开 MainWindow() 时)我得到一个 ArithmeticException。
我已经尝试将我的每个 FreeLibrary() 放在单独的 if 中,以查看其中一个是否未正确执行,但没有任何成功。
我还将我的每个 FreeLibrary() 都放在了while 中,以确保引用计数变为 0,但我还有另一个有趣的事情:我的应用程序锁定了我的最后一个 Dll。它正确地执行了第一个和第二个while,但卡在了最后一个。我必须手动停止应用程序,我无法一步一步地继续我的工作,并且线程堆栈上没有一个错误或其他任何错误。
这是我的代码:
public partial class MainWindow : Window
{
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
static extern bool FreeLibrary(IntPtr hModule);
public MainWindow()
{
InitializeComponent();
try
{
string dll1Path = "dll/dll1.dll";
string dll2Path = "dll/dll2.dll";
string dll3Path = "dll/dll3.dll";
IntPtr dll3Link = LoadLibrary(dll3Path);
IntPtr dll2Link = LoadLibrary(dll2Path);
IntPtr dll1Link = LoadLibrary(dll1Path);
if(FreeLibrary(dll3Link) == true && FreeLibrary(dll2Link) == true && FreeLibrary(dll1Link) == true)
Console.WriteLine("All DLL have been unloaded");
else
Console.WriteLine("One or more DLL were not unloaded properly");
}
catch (Exception ex)
{
Console.WriteLine("ERROR : " + ex.Message);
}
}
}
【问题讨论】:
-
你在玩火,你被烫伤了。抽动 DLL 通常不是一件安全的事情,您不知道 DLL 中正在运行什么代码。首先不要伤害,让 Windows 来处理,DLL 将在程序终止时被卸载。
-
如果我不使用
FreeLibrary(),我仍然会得到一个算术异常。 -
联系 DLL 的供应商或作者以获得支持。
标签: c# .net wpf visual-studio-2012 dll