У меня есть родное приложение C ++, которое использует управляемую сборку C ++ и загружает ее с помощью LoadLibrary () без проблем. Однако мне пришлось сделать две вещи, прежде чем LoadLibrary () сработал:
- Убедитесь, что в текущем каталоге находится управляемая сборка (используйте chdir () для изменения каталога)
- В управляемой сборке первая функция, вызываемая собственным кодом, определяет только обработчик для события
AppDomain::CurrentDomain->AssemblyResolve
, которое явно загружает сборки из папки управляемого приложения. Затем он вызывает другую управляемую функцию для выполнения остальной части инициализации.
Причина последнего пункта заключается в том, что CLR пытается загрузить зависимость сборки, только если функция использует ее. Поэтому я должен был убедиться, что на типы в несистемных сборках не ссылаются до определения обработчика AssemblyResolve
.
ref class AssemblyResolver
{
public:
/// The path where the assemblies are searched
property String^ Path
{
String^ get()
{ return path_; }
}
explicit AssemblyResolver(String^ path)
: path_(path)
{ /* Void */ }
Assembly^ ResolveHandler(Object^ sender, ResolveEventArgs^ args)
{
// The name passed here contains other information as well
String^ dll_name = args->Name->Substring(0, args->Name->IndexOf(','));
String^ path = System::IO::Path::Combine(path_, dll_name+".dll");
if ( File::Exists(path) )
return Assembly::LoadFile(path);
return nullptr;
}
private:
String^ path_;
};
extern "C" __declspec(dllexport) void Initialize()
{
String^ path = "The path where the managed code resides";
AssemblyResolver^ resolver = gcnew AssemblyResolver(path);
AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(
resolver,
&AssemblyResolver::ResolveHandler
);
FunctionWhichUsesOtherManagedTypes();
}