До сих пор у меня был своего рода механизм плагинов, в котором я загружал dll, используя LoadLibrary и GetProcAddress, чтобы создать конкретный объект и вернуть общий интерфейс. Это работало нормально, пока я не решил, что один из dll должен быть exe.
Документация LoadLibrary говорит, что она может быть использована и для exe, поэтому я попробовал. Exe загружается без ошибок, как GetProcAddress. Но когда я пытаюсь вызвать конструктор моего конкретного объекта, я получаю нарушение прав доступа.
Я думал, что это произойдет, потому что загрузка exe не загружает все dll, которые он использует. Поэтому я попытался загрузить их с помощью LoadLibrary, но я получил ту же ошибку.
Любой совет по этому поводу?
Вот мой код (смешанный C ++ / CLI):
Interface* MCFactory::LoadInstanceFromAssembly( String ^ concreteAssemblyName, String ^ param ){
string fullPathToAssembly = "";
fullPathToAssembly += FileSystem::GetPathToProgramDirectory();
fullPathToAssembly += "\\" + marshal_as<string>(concreteAssemblyName);
MODULE hDLL = AssemblyLoader::GetInstance().LoadAssembly( fullPathToAssembly );
Interface* pObject = NULL;
if (hDLL != NULL){
t_pCreateInstanceFunction pCreateInstanceFunction =
(t_pCreateInstanceFunction) ::GetProcAddress (hDLL, CREATE_INSTANCE_FUNCTION_NAME.c_str());
if ( pCreateInstanceFunction != NULL ){
//Yes, this assembly exposes the function we need
//Invoke the function to create the object
pObject = (*pCreateInstanceFunction)( marshal_as<string>(param) );
}
}
return pObject;
}
(AssemblyLoader :: GetInstance (). LoadAssembly - это просто оболочка для :: LoadLibrary)