Я предполагаю, что ваш C # класс является статическим классом. Вам нужно создать слой взаимодействия в C ++ / CLI , прежде чем вы сможете использовать его в чистом C . Создайте класс C ++ / CLI , чтобы обернуть свой класс C # . После этого используйте функцию экспорта для экспорта определенных функций C . C ++ / CLI будет управлять взаимодействием от вашего имени. Практическое правило: если у вашего класса / функции есть какой-либо CLI, он будет CLI. Таким образом, ваши внешние функции должны возвращать только собственные типы данных.
extern "C" __declspec( dllexport ) int MyFunc(long parm1);
Вот статья, которая поможет вам начать работу. Он преобразует C ++ в C # , но в вашем случае процесс выполняется в обратном порядке. CodeProject К сожалению, нет удобного реверса PInvoke для чистого C .
К сожалению, я никогда не переходил с C # на C . Звучит как интересный проект. Удачи!
Хорошо. Если вы еще не поняли, у меня есть для вас быстрый образец.
C # CSLibrary.Math.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CSLibrary
{
static public class Math
{
static public int Add(int a, int b)
{
int c = a + b;
return c;
}
}
}
Cpp / C ++ Project CPPCLibrary.h (скомпилировано с опцией C ++ / CLI с зависимостями проекта)
#pragma once
using namespace System;
extern "C" __declspec( dllexport ) int MathAdd(int a, int b)
{
return CSLibrary::Math::Add(a, b);
}
C Project CTest.c (скомпилировано как код C)
#include "stdafx.h"
#pragma comment(lib, "../Debug/CPPCLILibrary.lib")
extern __declspec( dllimport ) int MathAdd(int a, int b);
int _tmain(int argc, _TCHAR* argv[])
{
int answer = MathAdd(10, 32);
_tprintf(_T("%d\n"), answer);
return 0;
}
Все файлы находятся в одном решении, но в разных проектах. Я подтвердил, что это сработало. Надеюсь, это поможет любому, кто сталкивается с этим.
Ура!