【发布时间】: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,否则它们可能会在下一次构建时重新生成,您必须重新编译您的客户端程序。