如何在C#应用程序中使用C++/CLI

Jas*_*Cav 14 .net c# command-line-interface

我试图从我的C#应用​​程序(通过C++/CLI)调用我的C++库.我按照这个问题的例子(针对我的具体应用).我的应用程序的设置是:

  • Project1:C++项目(我将其编译为DLL)
  • Project2:C++ Project(我的CLR包装器;只是上面例子中的头文件;引用Project1)
  • Project3:C#项目(参考Project2)

不幸的是,当我真正去访问我的C#应用​​程序中的CLR包装器对象时,我收到以下错误:

找不到类型或命名空间名称'YourClass'(您是否缺少using指令或程序集引用?)

我是否错误地设置了项目,或者还有其他我应该研究的内容?(不幸的是,我不能出于专有原因发布代码,但这是一个非常简单的代码,很容易遵循上面的例子.)

更新:

所以我完全按照Chris所说的去做(见下面的答案),但我仍然收到来自我的C#应用​​程序的消息"找不到类型或命名空间名称'MyProgram'(你是否缺少using指令或程序集)参考?).这是我的代码的(模拟).

  • Project1 - 这是我的C++应用程序.它编译/工作.我在其他地方用过它.(我从这个版本中获取了一个DLL.)
  • Project2 - 这是我的包装器的代码.

MyWrapper.h

#pragma once

#include "myorigapp.h"

using namespace System;

namespace MyProgram
{
    public ref class MyWrapper
    {
    private:
        myorigapp* NativePtr;

    public:
        MyWrapper() 
        {
            NativePtr = new myorigapp();
        }

        ~MyWrapper() 
        { 
            delete NativePtr;
            NativePtr = NULL;
        }

        void dostuff()
        { 
            NativePtr->dostuff(); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • Project3 - 这是我的C#应用​​程序.

Program.cs中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MyProgram;

namespace Testing
{
    class Program
    {
        static void Main(string[] args)
        {
            MyWrapper p = new MyWrapper();
            p.dostuff();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Project3引用引用Project1的Project2.所有内容都构建没有错误(除了我在上面的C#代码中描述的错误using MyProgram).

Chr*_*rle 8

仅仅包含纯C++应用程序的头文件就不够好了.您需要在Project2中使用托管对象包装非托管对象(即public ref class YourClassDotNet)

#include "YourHeader.h"

namespace MyManagedWrapper
{
    public ref class YourClassDotNet
    {
    private:
        YourClass* ptr;

    public:
        YourClassDotNet()
        {
            ptr = new YourClass();
        }

        ~YourClassDotNet()
        {
            this->!YourClassDotNet();
        }

        !YourClassDotNet()
        {
            delete ptr;
            ptr = NULL;
        }

        void SomeMethod()
        {
            ptr->SomeMethod();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1.不要忘记提及`MyManagedWrapper`的那些方法通常必须进行从.NET数据类型到本机C++数据类型的某种类型转换,反之亦然. (2认同)

Jas*_*Cav 4

好吧,好吧,我现在感觉很愚蠢。

事实证明,我遇到的问题(我几周前解决了 - 只是更新这个答案)是我包含了头文件(请参阅 Chris 的答案),但我实际上没有包含CPP 文件(除了包含头文件之外是空的)。

完成此操作后,DLL 就会正确编译,并且我可以从 C# 代码调用 C++ 函数(使用 C++/CLI)。

  • 我现在也遇到同样的问题,但无法理解你的解决方案。也许你可以解释一下?谢谢 (3认同)