c# - 从 C++ 调用 C#,C# 命名空间中的 "."有困难

标签 c# c++ com

首先,我承认我有点偏袒这一点——当我将它融入现实世界时,我漂亮干净的示例代码不起作用。话虽这么说……

我有一个名为 CPierce.CSharpCall.dll 的 DLL,其中包含类似于以下 C# 的内容:

namespace CPierce.CSharpBridge
{
    [System.Runtime.InteropServices.Guid("3D08DF02-EFBA-4A65-AD84-B08ADEADBEEF")]
    public interface ICSide
    {
        // interface definition omitted...
    }
    [System.Runtime.InteropServices.Guid("CBC04D81-398B-4B03-A3D1-C6D5DEADBEEF")]
    public partial class CSide : ICSide
    {
        // class definition omitted...
    }
}

这是用 regasm/tlb 等注册的。然后,我的 C++ 代码看起来像这样:

#import "CPierce.CSharpCall.tlb" named_guids

    // Contains syntax errors!
int myfunc()
{
    HRESULT hRes = S_OK;
    CoInitialize(NULL);
    CPierce.CSharpBridge::ICSide *pManagedInterface = NULL;

    hRes = CoCreateInstance(
            CPierce.CSharpBridge::CLSID_Class1, 
            NULL, CLSCTX_INPROC_SERVER, 
            CPierce.CSharpBridge::ICSide, 
            reinterpret_cast<void**> (&pManagedInterface));

    // Calls to the interface omitted....

    CoUninitialize();
    return 0;
}

当然,问题是关于 CPierce.CSharpBridge 的语法错误。我知道在 C++ 中,如果我想拥有与 C# 代码类似的命名空间,我可以说:

namespace CPierce
{
    namespace CSharpBridge
    {
        // definitions go here
    }
}

但我不认为这就是我在这里寻找的东西,因为我只需要引用另一个命名空间中的两个常量,而不需要将整个方法放在该命名空间中。

完成对 CoCreateInstance 的调用所需的 C++ 语法是什么


更新:在更深入(更深入)的检查中,我发现由 regasm 创建的我的 .tlb 文件几乎是空的。当我将所有源代码连接成一个 .cs 文件并编译时:

csc /debug /t:library BigFile.cs 
regasm BigFile.dll /tlb:BigFile.tlb

我得到了一个很大(而且很有用)的 tlb 文件。

当我从 Visual Studio 编译整个项目时,我得到了一个 .DLL,但 regasm 没有对它做任何事情,而是生成了一个最小的 .tlb 文件。 (ildasm 显示两个 DLL 之间几乎没有区别)

如果我在 Visual Studio 中编译 BigFile.cs,我得到一个同样无用的 DLL。

我很难过。

最佳答案

C++ 不使用 . 运算符来分隔 namespace ;它使用 ::。您将使用 CPierce::CSharpBridge 而不是 CPierce.CSharpBridge。不幸的是,这似乎对您没有帮助,因为您不知道 TLB 实际生成的命名空间是什么。

一个简单的解决方案是根本不使用命名空间并在没有命名空间的情况下导入:

#import "CPierce.CSharpCall.tlb" named_guids no_namespace

关于c# - 从 C++ 调用 C#,C# 命名空间中的 "."有困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918782/

相关文章:

c# - TrueForAll 方法如何工作? C# 联机

C# 重新抛出异常 : how to get the exception stack in the IDE?

c++ - 成员函数的隐藏实现(如静态全局函数)

c++ - 使用pthread在c++中运行后台进程

windows - 为什么我不能浏览 dll 来了解其中的内容? : "Some components could not be browsed"

visual-c++ - 为什么 ATL COM map 扫描代码期望第一个条目是 _ATL_SIMPLEMAPENTRY 类型?

c++ - 将 Qt 线程与 COM 线程混合

c# - LinearGradiantBrush 单独应用于下划线和文本,但不一起应用于

c# - 字符串转换为日期时间

C++:用 const 成员替换类数组的元素