Как повторно использовать сборку .Net из приложения на чистом C - PullRequest
5 голосов
/ 10 ноября 2010

У меня есть старое приложение, написанное на C, и я хотел бы постепенно переместить некоторый код в c #. Но прежде чем я смогу переписать все, мне понадобится всего несколько компонентов, написанных на C #, которые будут использоваться в C.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Я предполагаю, что ваш 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;
}

Все файлы находятся в одном решении, но в разных проектах. Я подтвердил, что это сработало. Надеюсь, это поможет любому, кто сталкивается с этим.

Ура!

0 голосов
/ 10 ноября 2010

Если код является чистым C, вы можете поместить его в визуальный проект сборки C ++ без особых затруднений.Оттуда у вас будет доступ к обычному .net api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...