Это может помочь вам, если вы подумаете: «Или возможно добавить каталог к механизму загрузки DLL во время выполнения в .NET, чтобы на эти базовые библиотеки Matlab ссылались правильно, не перезапуская машину»:
В одном приложении я использую следующий код, чтобы сообщить .NET, где искать сборки, когда он пытается загрузить их динамически. В моем случае это нужно, так как мое приложение загружается как расширение другой программы, поэтому мои dll не находятся в той же директории, что и exe приложения. Возможно, это относится и к вам?
В моем случае моя основная программа dll загружена правильно, потому что она зарегистрирована для COM-взаимодействия. Но мне нужно сделать следующее, чтобы MS Enterprise Library загружала свои сборки из-за того, как это происходит в какой-то необычной динамичной манере. Следующий код указывает .NET искать каталог текущей исполняемой сборки при поиске сборок для загрузки. Вы можете сделать то же самое с любыми каталогами, которые вы хотите видеть в .NET, например те, которые основаны на переменных среды.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;
namespace CommonClasses
{
/// <summary>
/// Helper class to ensure the Common Language Runtime can dynamically load our referenced dlls.
/// Because our components are called from COM via iexplore.exe the executing directory is likely to be something like
/// c:\program files\internet explorer\, which obviously doesn't contain our assemblies. This only seems to be a problem
/// with the Enterprise Library so far, because it dynamically loads the assemblies it needs.
/// This class helps by directing the CLR to use the directory of this assembly when it can't find the assembly
/// normally. The directory of this assembly is likely to be something like c:\program files\my program\
/// and will contain all the dlls you could ask for.
/// </summary>
public static class AssemblyResolveAssistant
{
/// <summary>
/// Records whether the AssemblyResolve event has been wired.
/// </summary>
private static bool _isWired = false;
/// <summary>
/// Add the handler to enable assemblies to be loaded from this assembly's directory, if it hasn't
/// already been added.
/// </summary>
public static void AddAssemblyResolveHandler()
{
if (!_isWired)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
_isWired = true;
}
}
/// <summary>
/// Event handler that's called when the CLR tries to load an assembly and fails.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Assembly result = null;
// Get the directory where we think the assembly can be loaded from.
string dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
AssemblyName assemblyName = new AssemblyName(args.Name);
assemblyName.CodeBase = dirName;
try
{
//Load the assembly from the specified path.
result = Assembly.Load(assemblyName);
}
catch (Exception) { }
//Return the loaded assembly, or null if assembly resolution failed.
return result;
}
}
}
Затем вызовите метод AssemblyResolveAssistant.AddAssemblyResolveHandler()
, прежде чем делать что-либо, что потребует загрузки сборок вне обычных папок.