【问题标题】:Check if a dll is installed and available检查 dll 是否已安装且可用
【发布时间】:2012-09-05 12:49:00
【问题描述】:

我正在尝试制作一个可能依赖于 Wacom 数位板的应用程序。该程序不需要工作,但它是一个很好的补充。虽然,它也应该在没有安装 Wintab32.dll 的计算机上工作,我想检查一下 DLL 是否可用。

这段代码会产生错误,我想在错误产生之前捕获它。我正在使用 WintabDN 来支持 .net Wacom 应用程序。

if (WintabDN.CWintabInfo.IsWintabAvailable())
{
    // Initialize Wintab
    WintabLib.Initialize(true);
    WintabLib.OnWintabPacketReceived += WintabLib_OnWintabPacketReceived;
}

失败 IsWintabAvailable: System.DllNotFoundException: 无法加载 DLL 'Wintab32.dll':找不到指定的模块。 (来自 HRESULT 的异常:0x8007007E) 在 WintabDN.CWintabFuncs.WTInfoA(UInt32 wCategory_I,UInt32 nIndex_I,IntPtr IpOutput_O) 在 WintabDN.CWintabInfo.IsWintabAvailable()

这个错误的问题在于它是一个消息框,而不是包抛出的异常。如何防止出现此消息框?

【问题讨论】:

  • 为什么不直接使用 File.Exists() 方法?
  • 那么我应该在哪个文件夹中查找此 DLL?

标签: c# .net dll


【解决方案1】:

这有点棘手,因为底层异常已经在处理中了。

试图阻止消息框显示将很困难,如果不是不可能的话。你可以做一些真正的黑客行为,比如观察者线程来捕捉前台窗口的变化,然后手动向应用程序的底层消息队列发送鼠标点击消息,以尝试触发消息框上的 OK 按钮。

所以我有两个建议:this is the official topic on DLL search order;您可以使用它来模拟搜索并提前找到文件。

如果您不想这样做,您可以从kernel32.dll 导入LoadLibrary 方法,然后调用它来尝试加载WintabDN 库尝试使用的DLL;如果您遇到异常,那么您知道 WintabDN 库也会。这是一个几乎相关的主题,可以帮助绑定 LoadLibrary:http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

【讨论】:

    【解决方案2】:

    尝试以下哪些答案:

    (如果系统上没有安装 Wintab,Wintab SDK 示例将无法运行。如果系统上没有平板电脑(没有 Wintab),如何使我的程序工作?)

    http://www.wacomeng.com/windows/docs/WacomWindevFAQ.html

    【讨论】:

      【解决方案3】:

      如何防止此消息框出现?

      你不能:

          public static bool IsWintabAvailable()
          {
              IntPtr buf = IntPtr.Zero;
              bool status = false;
      
              try
              {
                  status = (CWintabFuncs.WTInfoA(0, 0, buf) > 0);
              }
              catch (Exception ex)
              {
                  MessageBox.Show("FAILED IsWintabAvailable: " + ex.ToString());
              }
      
              return status;
          }
      

      :D

      我讨厌库开发人员,编写这样的代码。他们不应该决定您将选择哪种错误处理机制。

      但它是开源的,你可以解决这个问题。
      或者您可以在他们的跟踪器上发布一个错误,然后等待他们修复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2019-11-21
        相关资源
        最近更新 更多