到目前为止,我有某种插件机制,其中我使用 LoadLibrary 和 GetProcAddress 加载 dll 以创建一个具体对象并返回一个公共接口。在我决定其中一个 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 的包装器)