检查dll是否已安装且可用

时间:2012-09-05 12:49:00

标签: c# .net dll

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

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

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

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

此错误的问题在于它是一个消息框,而不是包引发的异常。如何阻止此消息框显示?

3 个答案:

答案 0 :(得分:2)

这有点棘手,因为已经在处理基础异常。

如果不是不可能的话,试图阻止消息框显示将很困难。你可以做一些非常hacky的东西,比如一个观察者线程来捕捉前景窗口的变化,然后手动发送一个鼠标点击消息到应用程序的底层消息队列,尝试触发上面的OK按钮消息框。

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

如果您不想这样做,可以从LoadLibrary导入kernel32.dll方法,然后调用它来尝试加载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

答案 1 :(得分:1)

尝试以下答案:

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

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

答案 2 :(得分:0)

  

如何阻止此消息框显示?

你不能:

    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

我讨厌图书馆开发人员,编写这样的代码。他们不应该决定你会选择什么错误处理机制。

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