一、CLR类库
在CLR类库中实现C++/CLI和C#混合编程。CLR类库既能够被C++调用,也能够被C#引用(访问其中的托管类)。
1、C++通过C++/CLI调用C#
C#示例:
using System;
namespace CSharp
{
public class CSharpClass
{
public void Print()
{
Console.WriteLine("CSharp::CSharpClass::Print");
}
}
}
C++/CLI示例(分别是.h和.cpp):
#pragma once
#ifdef CSHARP_CALLER_EXPORTS
#define CSHARP_CALLER_API __declspec(dllexport)
#else
#define CSHARP_CALLER_API __declspec(dllimport)
#pragma comment(lib, "CLRProject.lib")
#endif // !_CSHARP_CALLER_
class CSHARP_CALLER_API CSharpCaller
{
public:
void Print();
};
#include "pch.h"
#include "CSharpCaller.h"
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace CSharp;
void CSharpCaller::Print()
{
CSharpClass^ sc = gcnew CSharpClass();
sc->Print();
Native指针和托管引用之间的转换
//void* psc = GCHandle::ToIntPtr(GCHandle::Alloc(sc)).ToPointer();
//GCHandle handle = GCHandle::FromIntPtr(IntPtr(psc));
//CSharpClass^ sc2 = safe_cast(handle.Target);
//sc2->Print();
}
C++示例:
#include "../CLRProject/CSharpCaller.h"
int main(int argc, char* argv[])
{
CSharpCaller *sc = new CSharpCaller();
sc->Print();
return 0;
}
2、C#通过C++/CLI调用C++
C++/CLI示例(分别是.h和.cpp):
#pragma once
namespace CLRProject
{
public ref class ManagedClass
{
public:
void Print();
};
}
#include "pch.h" #include "ManagedClass.h" #includenamespace CLRProject { void ManagedClass::Print() { std::cout << "CLRProject::ManagedClass::Print"; } }
C#示例:
using System;
using CLRProject;
namespace ManagedProject
{
class Program
{
static void Main(string[] args)
{
ManagedClass mc = new();
mc.Print();
}
}
}
二、其他
1、C#调用C++,也可以通过DLLImportAttribute和Swig实现。
2、当前编译环境中已经安装了.Net6 SDK,却在C++/CLI项目中使用.Net5 SDK,编译报错NETSDK1145,可以改变编程环境或者编辑当前项目文件.vcxproj进行设置。
编辑项目文件的方式,在.vcxproj中添加:
5.0.13
其中,具体版本号可以参考目录:
三、参考
https://docs.microsoft.com/en-us/dotnet/core/tools/sdk-errors/netsdk1145



