加载使用GAC DLL的运行代码时,防止出现System.IO.FileNotFoundException

时间:2010-02-23 18:03:44

标签: c# assemblies daq-mx nidaqmx

我正在使用第三方API来访问一些数据采集硬件(使用DAQmx驱动程序的NI硬件)。为此,我添加了对其驱动程序DLL的引用。

当我在安装了驱动程序的机器上运行代码时没问题。但是当我在没有驱动程序的机器上运行时,我得到一个System.IO.FileNotFoundException无法在try / catch中捕获。

在执行API代码之前,如果dll可用且可以使用其类型,我如何检查。这很重要,因为并非所有机器都支持这种数据采集硬件(因此安装了驱动程序)。

我不确定,但我认为dll是在已安装驱动程序的计算机上的GAC中注册的。

1 个答案:

答案 0 :(得分:0)

您需要执行以下操作。如果程序集存在,只需将其更改为返回true / false。 (取自here

static void Main(string[] args)
    {
        AssemblyLoader("System.Xml, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false);
        AssemblyLoader("System.Xml", false);
        AssemblyLoader("System.Drawing", true);
    }

    public static void AssemblyLoader(string LoadedAssemblyName, bool PartialName)
    {
        try
        {
            Assembly LoadedAssembly;
            Console.WriteLine("| Loading Assembly {0}", LoadedAssemblyName);
            if(PartialName == true)
                LoadedAssembly = Assembly.LoadWithPartialName(LoadedAssemblyName);
            else
                LoadedAssembly = Assembly.Load(LoadedAssemblyName);

            Console.WriteLine("Full Name: {0}", LoadedAssembly.FullName);
            Console.WriteLine("Location: {0}", LoadedAssembly.Location);
            Console.WriteLine("Code Base: {0}", LoadedAssembly.CodeBase);
            Console.WriteLine("Escaped Code Base: {0}", LoadedAssembly.EscapedCodeBase);
            Console.WriteLine("Loaded from GAC: {0}", LoadedAssembly.GlobalAssemblyCache);
        } catch(FileNotFoundException) {
            Console.WriteLine("EXCEPTION: Cannot load assembly.");
        }
    }