【问题标题】:How to reuse a .Net assembly from a pure C application如何重用纯 C 应用程序中的 .Net 程序集
【发布时间】:2010-11-09 22:42:26
【问题描述】:

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

【问题讨论】:

    标签: .net c++ c interop


    【解决方案1】:

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

    extern "C" __declspec( dllexport ) int MyFunc(long parm1);
    

    这里有一篇文章可以帮助您入门。它将 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;
            }
        }
    }
    

    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;
    }
    

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

    干杯!

    【讨论】:

    • 如果我有时间我想创建一个小演示。这听起来很有趣。
    【解决方案2】:

    如果代码是纯C,你可以将它放入一个可视化的C++汇编项目中,没有太大的困难。从那里,您可以访问常规的 .net api。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2015-04-05
      相关资源
      最近更新 更多