1.com组件的方式
---- 创建部分 ----
a)创建c#的类库工程,按照com组件编写规范编写。
Class1.cs文件内容如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
public interface IMyClass
{
void Initialize();
void Dispose();
int Add(int a,int b);
}
public class MyClass : IMyClass
{
public void Initialize()
{
}
public void Dispose()
{
}
public int Add(int a,int b)
{
return a+b;
}
}
}
b)工程属性->应用程序->程序集信息->程序集COM可见,工程属性->生成->为COM互操作注册。
c)设置需要的(如Debug,x64)配置,重新生成,会生成projname.tlb文件。
---- 调用部分 ----
a)使用vs创建普通的c++ win32控制台应用程序。
b)编写代码,main函数所在文件中编写示例如下。
#include "stdafx.h"
#include <iostream>
using namespace std;
#import "../ClassLibrary/bin/x64/Debug/ClassLibrary.tlb"
int _tmain(int argc,_TCHAR* argv[])
{
CoInitialize(NULL); // 初始化com环境
ClassLibrary::IMyClassPtr p(__uuidof(ClassLibrary::MyClass));
cout << p->Add(3,4) << endl;
return 0;
}
c)配置好后(如Debug,x64),重新编译生成,会在./x64/Debug文件夹下发现classlibrary.tlh和classlibrary.tli文件,说明c#编写的ClassLibrary.dll组件导入成功。
d)运行代码,输出7,OK。
2.clr工程的方式
---- 创建部分 ----
a)创建c#的类库工程。
示例Class1.cs文件内容如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibraryDll
{
public class Class1
{
public int testDllMut(int a,int b)
{
return a * b;
}
}
}
b)设置需要的(如Debug,x64)配置,重新生成,会生成projname.dll文件。
---- 调用部分 ----
a)使用vs创建普通的c++ win32控制台应用程序,设置工程属性->常规->公共语言运行时支持->公共语言运行时支持(/clr),
b)编写代码,main函数所在文件中编写示例如下。
#include "stdafx.h"
#include <iostream>
using namespace std;
#using "../ClassLibraryDll/bin/x64/Debug/ClassLibraryDll.dll"
int _tmain(int argc, _TCHAR* argv[])
{
ClassLibraryDll::Class1^ c1 = gcnew ClassLibraryDll::Class1();
cout << c1->testDllMut(3,5) << endl;
return 0;
}
c)运行代码,输出15,OK。

本文详细介绍了两种在C++中调用C#代码的方法:1)通过COM组件的方式,创建C#接口并实现,然后在C++中使用#import导入并调用;2)利用CLR支持,创建C#类库,设置公共语言运行时支持后,在C++中直接引用并调用。两种方法均成功实现了跨语言的函数调用。
&spm=1001.2101.3001.5002&articleId=120500989&d=1&t=3&u=1b768914b2a1406791e875c5da6dabcb)
2850

被折叠的 条评论
为什么被折叠?



