如何从纯C应用程序中重用.Net程序集

5

我有一个用C语言编写的遗留应用程序,我想逐步将一些代码移植到C#。但在重写所有内容之前,我需要先编写几个用C#编写的组件,这些组件将从C中使用。

2个回答

2
我假设你的C#类是一个静态类。在你能够在纯C中使用它之前,你需要创建一个C++/CLI的互操作层。创建一个C++/CLI类来封装你的C#类。完成后,使用导出函数导出特定的C函数。C++/CLI将代表您管理互操作。原则是如果您的类/函数有任何CLI,它将是CLI。因此,您的外部函数应仅返回本机数据类型。
extern "C" __declspec( dllexport ) int MyFunc(long parm1);

这里有一篇文章可以帮助您入门。它将C++转换为C#,但在您的情况下该过程是相反的。不幸的是,对于纯粹的C,没有方便的反向PInvokeCodeProject 不幸的是,我从未从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++ 项目 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 项目 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;
}

所有文件都在同一个解决方案中,但是它们属于不同的项目。我已经确认这种方法可行。希望这能帮助到任何遇到类似问题的人。
干杯!

如果我有时间,我想创建一个小演示。这听起来很有趣。 - user295190

0
如果代码是纯C的,你可能可以将其放入一个Visual C++汇编项目中,而不会遇到太多困难。从那里开始,你就可以访问常规的.NET API了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接