【问题标题】:Dynamically load native embedded dll from C++/CLI (clr based) project/dll从 C++/CLI(基于 clr)项目/dll 动态加载本机嵌入式 dll
【发布时间】:2014-03-05 01:57:33
【问题描述】:

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

我想要做的是 embed native dll's 在 C++/CLI libary/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();
      }
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 嗨,伊戈尔,感谢您提供的信息。假设您说管理中没有任何内容允许加载库,则“链接”可以(尽管使用旧的本机接口)用于加载 dll 和函数。但是,它不包括为嵌入式资源获取“资源”流并将其放入文件中。还有没有人有任何想法放在哪里?
    • 好的,我想我想出了“将嵌入式 dll 转储到文件”部分。请参阅原始问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2011-10-24
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多