Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 该语言不支持 我在C++中定期编码,对于我现在正在做的具体项目,我正在编写一个C++的LIB,其方法将在C语言中使用,其方法将在C应用程序中使用。_C#_C++_Clr - Fatal编程技术网

C# 该语言不支持 我在C++中定期编码,对于我现在正在做的具体项目,我正在编写一个C++的LIB,其方法将在C语言中使用,其方法将在C应用程序中使用。

C# 该语言不支持 我在C++中定期编码,对于我现在正在做的具体项目,我正在编写一个C++的LIB,其方法将在C语言中使用,其方法将在C应用程序中使用。,c#,c++,clr,C#,C++,Clr,我在Windows 10上使用Microsoft Visual Studio 2017 我创建了一个包含3个项目的解决方案: 一个C++/CLI动态库(新项目= > VisualC++ + > CLR= >类库) C库(newproject=>WindowsClassicDesktop=>类库(.NETFramework)) 和一个C应用程序(newproject=>WindowsClassicDesktop=>Console应用程序(.netframework)) 现在,我只是想让这3个项目进

我在Windows 10上使用Microsoft Visual Studio 2017

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

  • 一个C++/CLI动态库(<代码>新项目= > VisualC++ + > CLR= >类库)
  • C库(
    newproject=>WindowsClassicDesktop=>类库(.NETFramework)
  • 和一个C应用程序(
    newproject=>WindowsClassicDesktop=>Console应用程序(.netframework)
  • 现在,我只是想让这3个项目进行通信,我在C++库和C语言库之间似乎有问题。 < >我的C++库中的代码如下: 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);
        };
    }
    
    #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);
        };
    }
    
    我的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.";
            }
        }
    }
    
    按原样,此代码生成时既没有错误也没有警告。所以我可以调用我的
    静态双加(双arg1,双arg2)从我的C++ LIB中,在我的C LyLIB方法>代码>静态公共双加法(双ARG1,双ARG2)< /代码>中,但是如果我试图取消在<强>包装器中的以下代码。
    
            //static public string TestCppLib()
            //{
            //    return cppClass.test();
            //}
    
    我得到语言不支持的
    'cppClass.test(?)
    错误消息:

    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++语言中调用一个方法,而不是其他问题?我的<代码>公共字符串WrApPrestTest[()> <代码>方法返回一个字符串,我可以在C语言应用程序中使用它(它可以工作,我可以显示它),为什么我不能调用C++中的那个特定C++方法呢?这也是我第一次在C语言中编码,

    在C++ C++中,如果该方法要被C语言应用程序/LIB使用,字符串不能返回原生C++模板类型,因为C代码不知道如何使用它。p> 必须使用该类型的托管(.Net变量);对于C++ 字符串,它是<代码>字符串^ < /代码>。
    ^
    表示它是一个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);
        };
    }
    
    #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);
        };
    }
    

    其余部分保持不变。

    我不确定这是否是错误的原因,但
    std::string
    !=
    System.String
    我是@Neijwiert的。我很确定这就是问题的原因。还有一个旁注:为什么要为C++/CLI库创建包装器类?C++/CLI的全部要点是,您可以直接在托管.NET应用程序中与它进行接口。您不能返回本机C++模板类型,并期望C++代码能够使用它。只有C++编译器才能做到这一点,只有完全相同的编译器版本使用完全相同的编译选项。将返回类型更改为
    String^
    。它是字符串的托管(.Net变量)。string是非托管类型。使用
    ^
    表示它是ref类(托管)指针。