从C++/CLI(基于clr)项目.dll动态加载本机嵌入式dll



我有一个C#托管库(dll),它正在调用C++/CLI(w//clr)库,以便调用一些本机库函数。

我想做的是本机dll嵌入到C++/CLI库.dll中(以便创建一个简单的库实体),然后动态加载它们(本机dll)。

我已经能够成功地嵌入到C++/CLI库中,但我不知道如何使用这些数据来动态加载它们。我尝试使用(AssemblyResolve和Assembly.Load),但在尝试加载C++/CLI库返回"无法加载文件或程序集"错误之前,我没有机会使用它。

我读过关于程序集初始值设定项的文章(看起来有点像dllmain)。我需要设置一个然后加载嵌入程序集的程序集吗?

更新:我已经写了下面的代码,将DLL从"资源"中拉出,并将其转储到一个文件中,这似乎运行良好。

{
Assembly ^ CurrentAssembly = Assembly::GetExecutingAssembly();
array<String^> ^ ResourceNames = CurrentAssembly->GetManifestResourceNames();
String^ BaseDir = AppDomain::CurrentDomain->BaseDirectory;
for (int i = 0; i < ResourceNames->Length; i++)
{
if ( ResourceNames[i]->EndsWith(".dll") )
{
Stream^ stream = CurrentAssembly->GetManifestResourceStream(ResourceNames[i]);
if ( stream != nullptr )
{
array<Byte^> ^ assemblyData = gcnew array<Byte^>(stream->Length);
FileStream^ fileStream = File::Create(BaseDir + ResourceNames[i]);
stream->CopyTo(fileStream);
fileStream->Close();
}
}
}
}

Win32 API不支持从内存加载本机DLL。你需要在磁盘上有文件才能使用它。Assembly.Load和朋友们只支持托管DLL(又名程序集)。

因此,您必须将DLL提取到一个临时位置,然后使用LoadLibraryGetProcAdress来使用其API。

下面是一篇描述如何做到这一点的帖子:http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

最新更新