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

时间:2014-03-05 01:57:34

标签: .net c++-cli embed native .net-assembly

我有一个调用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();
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

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