Предотвратите исключение System.IO.FileNotFoundException при загрузке исполняемого кода, который использует DLL из GAC
Я использую сторонний API для доступа к некоторым аппаратным средствам сбора данных (аппаратное обеспечение National Instruments с драйвером DAQmx). Для этого я добавляю ссылку на его драйвер dll.
Когда я запускаю код на машине, на которой установлен драйвер, нет проблем. Но когда я бегу на машине без водителя, я получаю System.IO.FileNotFoundException
это не может быть поймано в попытке / поймать.
Как я могу проверить, прежде чем я выполню код API, если dll доступна и ее типы могут быть использованы. Это важно, потому что не все машины будут поддерживать этот тип оборудования сбора данных (и, следовательно, драйвер будет установлен).
Я не уверен, но я думаю, что dll зарегистрирована в GAC на машинах, на которых установлен драйвер.
1 ответ
Вы хотите сделать что-то вроде следующего. Просто измените его, чтобы он возвращал 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.");
}
}