Calling C# COM DLL from C++

Calling C# COM DLL from C++

本文关键字:from C++ DLL COM Calling      更新时间:2023-10-16

C++代码如下

#include "stdafx.h"
#include <Windows.h>
#import "C:shreyasDocumentsConsoleApplication1ConsoleApplication1binDebugConsoleApplication1.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给出错误作为未定义的标识符。

编译ConsoleApplication1:时,请注意生成警告

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

这当然不好。您还可以通过Oleview.exe的View+Typelib命令查看.tlb文件。或者打开#import指令用文本编辑器生成的.tlh文件,在C++项目的Debug目录中找到它。您将看到MyClass完全丢失,从而导致编译错误。

这是因为:

   class MyClass : IMyClass

你忘了申报public。必需。