Я разработал DLL в Managed C ++, которая загружает некоторые плагины (реализованные на любом языке .NET) во время выполнения, используя System.Reflection.Assembly.LoadFile . Интерфейс, который реализован всеми плагинами, реализован на C #. Он используется кодом Managed C ++ следующим образом:
#using <IMyPluginInterface.dll> // Make the 'IMyPluginInterface' type available
ref class PluginManager {
List<IMyPluginInterface ^> ^m_plugins;
// Load all plugins in a well-known directory.
void load() {
for ( string dllFile in Directory.GetFiles( .., "*.dll" ) ) {
// Lookup the type of the plugin object using Reflection
Type pluginType = ...;
// Finally, instantiate the plugin and add it to our list.
m_plugins.Add( (IMyPluginInterface ^)Activator.CreateInstance( pluginType ) );
}
}
}
Загрузка плагинов работает хорошо; проблема, с которой я сталкиваюсь, заключается в том, что во время выполнения файл IMyPlugnInterface.dll
может не находиться в том же каталоге, что и управляемая C ++ DLL. Это означает, что тип IMyPluginInterface недоступен во время выполнения, и генерируется исключение.
Ранее я спрашивал, возможно ли повлиять на путь поиска, используемый при разрешении библиотек DLL, на которые ссылается оператор #using
. К сожалению, это не дало никакого результата.
Может быть, есть другой подход к этому? Можно ли скомпилировать типы, на которые ссылается #using
, в управляемую C ++ DLL? Может быть, у кого-то есть другое решение?