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

mas*_*ief 64 c# c++ pinvoke managed-c++ c++-cli

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

我已经看到一些关于使托管C++包装类与它交互的注释,但我不知道从哪里开始.我也不知道如何将其与所有其他代码一起编译.我真的找不到这方面的教程,谷歌在托管C++上展示的东西似乎并没有什么帮助.

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

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

Gan*_*ant 56

你看过C++/CLI吗?

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

请注意,为了进行编译,您必须进入项目设置并将"Additional Dependencies"标记为"从父级继承",因为我们正在使用这些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!");
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

这在我的机器上给出了以下结果:

你好m3rlinez!

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

  • 要进入"附加依赖项"设置,请转到项目 - >属性 - >配置属性 - >链接器 (3认同)

Arv*_*rve 9

在同一进程中至少有三种方法可以从托管中调用非托管代码:

  1. C++/CLI
  2. 平台调用
  3. 将您的C++包装在COM对象中

在工作中我们使用C++/CLI,它似乎工作.

  • 现在有[CXXI](http://stackoverflow.com/a/9247254/332026)(发音性感). (3认同)
  • CXXI似乎已经演变为[CppSharp](https://github.com/mono/CppSharp) (2认同)