Предотвратите исключение System.IO.FileNotFoundException при загрузке исполняемого кода, который использует DLL из GAC - PullRequest
0 голосов
/ 23 февраля 2010

Я использую сторонний API для доступа к некоторым аппаратным средствам сбора данных (оборудование National Instruments с драйвером DAQmx). Для этого я добавляю ссылку на его драйвер dll.

Когда я запускаю код на машине, на которой установлен драйвер, проблем нет. Но когда я работаю на машине без драйвера, я получаю System.IO.FileNotFoundException, который не может быть пойман при попытке / ловле.

Как я могу проверить перед тем, как выполнить код API, доступна ли dll и могут ли использоваться ее типы. Это важно, потому что не все машины будут поддерживать такого рода оборудование для сбора данных (и, следовательно, драйвер будет установлен).

Я не уверен, но я думаю, что dll зарегистрирована в GAC на машинах, на которых установлен драйвер.

1 Ответ

0 голосов
/ 23 февраля 2010

Вы хотите сделать что-то вроде следующего. Просто измените его, чтобы он возвращал true / false, если сборка существует. (взято из здесь )

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.");
        }
    }
...