从 C++ 调用 C# COM DLL
Calling C# COM DLL from C++
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
作为未定义的标识符给出错误。
请注意编译 ConsoleApplication1 时收到的构建警告:
warning MSB3214: "C:...\ConsoleApplication1\bin\Debug\ConsoleApplication1.dll" does not contain any types that can be registered for COM Interop.
那当然不好。您还可以使用 Oleview.exe 的 View + Typelib 命令查看 .tlb 文件。或者用文本编辑器打开 #import 指令生成的 .tlh 文件,在 C++ 项目的调试目录中找到它。您会看到 MyClass 完全丢失,因此出现编译错误。
那是因为:
class MyClass : IMyClass
您忘记申报了public
。必填。
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
作为未定义的标识符给出错误。
请注意编译 ConsoleApplication1 时收到的构建警告:
warning MSB3214: "C:...\ConsoleApplication1\bin\Debug\ConsoleApplication1.dll" does not contain any types that can be registered for COM Interop.
那当然不好。您还可以使用 Oleview.exe 的 View + Typelib 命令查看 .tlb 文件。或者用文本编辑器打开 #import 指令生成的 .tlh 文件,在 C++ 项目的调试目录中找到它。您会看到 MyClass 完全丢失,因此出现编译错误。
那是因为:
class MyClass : IMyClass
您忘记申报了public
。必填。