【问题标题】:Calling C# COM DLL from C++从 C++ 调用 C# COM DLL
【发布时间】:2016-04-13 19:08:34
【问题描述】:

C++代码如下

#include "stdafx.h"
#include <Windows.h>
#import "C:\shreyas\Documents\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.tlb" no_namespace

int _tmain(int argc, _TCHAR* argv[])
{

    CoInitialize(NULL);
    IMyClassPtr obj;

    //iProgramPtr obj;
    obj.CreateInstance(__uuidof(MyClass));
    printf("value: %d",obj->display());
    CoUninitialize();
    getchar();

    return 0;
}

C#代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading.Tasks;

namespace demo
{
    [ComVisible(true)]
    public interface IMyClass
    {
        int display();
    }


    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    class MyClass : IMyClass
    {
        public int display()
        {
            Console.WriteLine("Hello");
            return 10;
        }
    }
}

我想从 C++ 代码中调用 C# 显示函数。我已经在 C# 项目属性中完成了所需的设置。在代码obj.CreateInstance(__uuid(MyClass)); 中,MyClass 将错误作为未定义的标识符。

【问题讨论】:

  • 查看与MyClass 关联的GUID 的生成tlh 文件(由#import 创建),它可能位于命名空间中或有一些附加注释。
  • 在 C++ 端,您必须在调用 CoUninitialize 之前释放 obj 指针
  • 您应该使用[Guid] 明确指定类和接口的ID,否则它们可能会在下一次构建时重新生成,您必须重新编译您的客户端程序。

标签: c# c++ com


【解决方案1】:

请注意编译 ConsoleApplication1 时收到的构建警告:

警告 MSB3214:“C:...\ConsoleApplication1\bin\Debug\ConsoleApplication1.dll”不包含任何可以为 COM 互操作注册的类型。

那当然不好。您还可以使用 Oleview.exe 的 View + Typelib 命令查看 .tlb 文件。或者使用文本编辑器打开 #import 指令生成的 .tlh 文件,在 C++ 项目的 Debug 目录中找到它。您会看到 MyClass 完全丢失,因此出现编译错误。

那是因为:

   class MyClass : IMyClass

你忘了声明它public。必填。

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2011-02-13
    • 2011-05-04
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多