不受语言支持

时间:2018-05-03 09:40:14

标签: c# c++ clr

我在C ++中定期编码,对于我正在处理的特定项目,我正在编写一个C ++库,其方法将在C#lib中使用,其方法将在C#app中使用

我在Windows 10上使用Microsoft Visual Studio 2017.

我创建了一个包含3个项目的解决方案:

  1. C ++ / CLI动态库(New Project => Visual C++ => CLR => Class Library
  2. C#lib(New Project => Windows Classic Desktop => Class Library (.NET Framework)
  3. 和一个C#app(New Project => Windows Classic Desktop => Console App (.NET Framework)
  4. 目前,我只是想让3个项目一起进行通信,而且我似乎在C ++ lib和C#lib之间存在问题。

    我的C ++ lib中的代码如下;

    cppLib.h

    #pragma once
    #include <string>
    
    using std::string;
    
    using namespace System;
    
    namespace cppLib {
        public ref class cppClass
        {
        public:
            static string test();
            static double add(double arg1, double arg2);
        };
    }
    

    cppLib.cpp

    #include "cppLib.h"
    
    namespace cppLib {
        string cppClass::test() {
            return "Hello World from C++ lib.";
        }
    
        double cppClass::add(double arg1, double arg2) {
            return arg1 + arg2;
        }
    }
    

    我的C#lib中的代码如下:

    Wrapper.cs

    using cppLib;
    
    namespace CsWrapper
    {
        public class Wrapper
        {
            //static public string TestCppLib()
            //{
            //    return cppClass.test();
            //}
    
            static public double Add(double arg1, double arg2)
            {
                return cppClass.add(arg1, arg2);
            }
    
            public string WrapperTest()
            {
                return "Hello World from C# lib.";
            }
        }
    }
    

    原样,此代码构建时没有错误也没有警告。所以我可以在C#lib方法static double add(double arg1, double arg2);中调用我的C ++库中的static public double Add(double arg1, double arg2)方法,但是如果我尝试在 Wrapper.cs 中取消注释以下代码:

            //static public string TestCppLib()
            //{
            //    return cppClass.test();
            //}
    

    我收到'cppClass.test(?)' is not supported by the language错误消息:

    Severity    Code        Description                                             Project     File                                        Suppression State
    Error       CS0570      'cppClass.test(?)' is not supported by the language     CsWrapper   D:\documents\...\CsWrapper\Wrapper.cs       Active
    

    这是什么意思?如何在我的C#lib中从我的C ++库中调用一个方法没有问题,但另一个我不能?我的public string WrapperTest()方法返回一个字符串,我可以在我的C#app中使用它(它可以工作,我可以显示它),那么为什么我不能在C#lib中调用那个特定的C ++方法呢?这也是我第一次用C#进行编码。

1 个答案:

答案 0 :(得分:0)

在C ++ / CLI中,如果C#app / lib要使用该方法,则不能将字符串作为本机C ++模板类型返回,因为C#代码将不知道如何使用它。

必须使用该类型的托管(.Net变体);对于C ++ string,它是String^^表示它是一个ref类(托管)指针。

代码变为:

<强> cppLib.h

#pragma once
#include <string>

using std::string;

using namespace System;

namespace cppLib {
    public ref class cppClass
    {
    public:
        static String^ test();
        static double add(double arg1, double arg2);
    };
}

<强> cppLib.cpp

#include "cppLib.h"

namespace cppLib {
    String^ cppClass::test() {
        return "Hello World from C++ lib.";
    }

    double cppClass::add(double arg1, double arg2) {
        return arg1 + arg2;
    }
}

其余的保持不变。