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

Dav*_*ave 5 .net c c++ interop

我有一个用C编写的遗留应用程序,我想逐步将一些代码移动到c#.但在能够重写所有内容之前,我需要在c#中首先编写一些将从C中使用的组件.

小智 2

我假设您的C#类是静态类。您需要先在C++/CLI中创建互操作层,然后才能在纯C中使用它。创建一个C++/CLI类来包装您的C#类。完成后,使用导出函数导出特定的C函数。C++/CLI 将代表您管理互操作。经验法则是,如果您的类/函数有任何 CLI,那么它就是 CLI。因此,您的外部函数应该只返回本机数据类型。

extern "C" __declspec( dllexport ) int MyFunc(long parm1);
Run Code Online (Sandbox Code Playgroud)

这是一篇帮助您入门的文章。它将C++转换为C#,但在您的情况下该过程是相反的。CodeProject不幸的是,没有针对纯C的方便的反向PInvoke

不幸的是我从未从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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

所有文件都位于同一解决方案但不同的项目中。我已经确认这有效。我希望这对遇到它的人有所帮助。

干杯!