【问题标题】:C# FreeLibrary() ArithmeticExceptionC# FreeLibrary() 算术异常
【发布时间】: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


【解决方案1】:

你在什么时候得到异常?

您可以调用File.Exists(dll1Path) 来检查您的DLL 是否存在。可能是你的问题

【讨论】:

  • 我对每个 DLL 都使用了 File.Exists(),它确实找到了所有这些。正如我所说,当我离开公共 MainWindow()
【解决方案2】:

对我来说,你的代码工作得很好。你在哪里 dll/dll1.dll,它们在你的 bin/debug 中吗?

【讨论】:

  • 正如我对@Tomtom 所说,File.Exists() 函数可以找到所有的 DLL,我认为这不是路径的问题。我仍然想知道你是如何做到这一点的......你是否创建了一个 WPF 应用程序?还是另一个?我应该把目录'dll'放在一个特定的地方吗?它实际上在我的 bin\debug
  • 有一件事我可能忘了告诉你:dll1.dll 需要 dll2.dll 和 dll3.dll 才能运行。有没有释放图书馆的命令?我必须释放 dll1 作为最后一个还是第一个?
  • 我认为你会释放 dll1,然后是 dll2,然后是 dll3
  • 我已经尝试了所有可能的订单,但仍然收到 ArithmeticException。这可能是 DLL 本身的问题吗?
  • 顺便说一句,我的 DLL 是 C++ 的,我无法访问 .h 和 .cpp。这就是我使用LoadLibrary() 函数的原因。但我不认为这是我的FreeLibrary() 让我得到这个 ArithmeticException 的原因。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 2014-12-16
  • 2019-04-08
  • 2018-04-22
  • 2023-04-03
  • 1970-01-01
  • 2023-03-23
  • 2019-02-25
相关资源
最近更新 更多