我有一个调用C ++ / CLI(w / / clr)库的C#托管库(dll),以便调用一些本机库函数。
我想要做的是在C ++ / CLI libary / dll中嵌入 native 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();
}
}
}
}
答案 0 :(得分:2)
Win32 API不支持从内存加载本机DLL。您需要将该文件放在磁盘上才能使用它。 Assembly.Load
和朋友只支持托管DLL(也就是程序集)。
因此,您必须将DLL解压缩到临时位置,然后使用LoadLibrary
和GetProcAdress
来使用其API。
这是一篇描述如何操作的帖子:http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx