【问题标题】:native dll calls a .NET dll本机 dll 调用 .NET dll
【发布时间】:2013-05-10 15:02:06
【问题描述】:

我正在尝试弄清楚这是如何工作的:

  • 我有一个 .NET dll,比如 NETDll.dll,我没有要修改的源代码。
  • 我想在我的 C++ 项目中使用该 NETDll.dll,它将创建一个本地 dll,比如 NativeDll.dll

所以这就是我认为的问题所在(我可能是错的):

  • 由于我的 NativeDll.dll 是原生的,所以它不能是 CLR/CLI dll。本机 dll 没有运行时引擎,但 CLR 有。

我应该怎么做?感谢您的任何建议。

【问题讨论】:

    标签: .net dll clr native


    【解决方案1】:

    您必须在 .NET 程序集中将某些内容公开为 COM。

    【讨论】:

    • 我该怎么做?我无法访问 .NET dll 的源代码
    • @NickTsui 您可能需要编写一个包装器。
    • 如何编写包装器?我找到了几个来源,但它们似乎都可以访问托管 C# 代码,而我没有。
    • @NickTsui 写另一个 dll。
    • 是的。但现在我遇到了这个问题:第三方 dll 没有强名称。
    【解决方案2】:

    您的本机 DLL 可以是混合模式的本机和 .NET 程序集,使用 C++/CLI。 Google 或在此处搜索“#pragma managed”/“#pragma unmanaged”,或查看任何有关 C++/CLI 的书籍。基本上,假设你有 Visual C++ 2010 或 2012,你可以这样写:

    #pragma unmanaged
    
    int main()
    {
      CallManagedTrampoline();
    }
    
    #pragma managed
    
    void CallManagedTrampoline()
    {
      TypeFromDotnetDLL t = new TypeFromDotnetDLL();
      t.CallSomething();
    }
    

    事实上,根据 .NET DLL 中的详细信息,您甚至可能不需要将 #pragma managed 放在 CallManagedTrampoline() 调用前面——有时您可以直接从非托管代码中调用。 C++/CLI 是你的朋友。

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 2012-03-05
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多