一尘不染

如何从C#调用C ++ / CLI?

c#

我有一个用C 实现的类,它负责程序的算术计算,以及一个使用WPF的接口。我使用C#处理输入,但是如何使用C 类呢?

我已经看到了一些有关使托管C
包装器类与之交互的评论,但我不知道从哪里开始。我也不知道该如何与其他所有代码一起进行编译。我真的找不到关于此的教程,谷歌在托管C
上显示的内容似乎并没有帮助。

有什么可以帮助我的吗?这对我来说似乎并不合理。

编辑
尝试了m3rLinEz解决方案,但它给了我BadImageFormatException,我认为这是因为未生成DLL。我做了一切,不知道发生了什么。有任何想法吗?


阅读 372

收藏
2020-05-19

共1个答案

一尘不染

您看过C ++ / CLI吗?

让我举一个简短的例子。这是Visual C ++-> CLR->类库项目的源文件。它基本上获取Windows用户名并返回它。

请注意,为了进行编译,您必须进入项目设置并将“其他依赖项”标记为“从父项继承”,因为我们正在使用这些Windows库(kernel32.lib,user32.lib,..)。

// CSCPP.h

#pragma once

#include "windows.h"

using namespace System;

namespace CSCPP {

    public ref class Class1
    {
        // TODO: Add your methods for this class here.
    public:
        String^ GetText(){
            WCHAR acUserName[100];
            DWORD nUserName = sizeof(acUserName);
            if (GetUserName(acUserName, &nUserName)) {
                String^ name = gcnew String(acUserName);
                return String::Format("Hello {0} !", name);
            }else{
                return gcnew String("Error!");
            }
        }
    };
}

现在创建了一个新的C#项目,并添加了对第一个C ++ / CLI类库项目的引用。然后调用实例方法。

namespace CSTester
{
    class Program
    {
        static void Main(string[] args)
        {
            CSCPP.Class1 instance = new CSCPP.Class1();
            Console.WriteLine(instance.GetText());
        }
    }
}

这在我的机器上产生了以下结果:

你好,m3rlinez!

C / CLI基本上是对C 标准的托管扩展。它允许您在C /
CLI项目中利用CLR类和数据类型,并将其公开给托管语言。您可以使用此方法为旧的C
库创建托管包装。有一些奇怪的语法,例如String^,定义对CLR String的引用类型。我发现“快速C / CLI-
不到10分钟即可学习C
/
CLI”
在这里很有用。

2020-05-19