0

我正在尝试从包装 C# .Net 函数的 C++ Cli 中导出一些 void/函数。

此时,我可以正确导出返回整数值的方法,但是当我尝试导出 Void 时,出现错误:

错误 C3395“Test2”:__declspec(dllexport) 无法应用于具有 __clrcall 调用约定 ClassLibrary1 的函数

这是完整的代码:

#pragma once

using namespace System;
using namespace System::Reflection;
using namespace RobinHoodLibrary;

namespace ClassLibrary1 {

    public ref class Class1
    {
        // TODO: Add your methods for this class here.
        RobinHood^ robin = gcnew RobinHood();

        public: int Add(int Number1, int Number2)
        {
            return robin->Add(Number1, Number2);
        }

        public: System::Void Test()
        {
            robin->Test();
        }

        public: int Test1(int i)
        {
            return robin->Test1(i);
        }

        public: System::Void Test2(String^ txt)
        {
            robin->Test2(txt);
        }

    };
}

extern __declspec(dllexport) int Add(int Number1, int Number2) {
    ClassLibrary1::Class1 c;
    return c.Add(Number1, Number2);
}

extern __declspec(dllexport) void Test() {
    ClassLibrary1::Class1 c;
    c.Test();
    return;
}

extern __declspec(dllexport) int Test1(int i) {
    ClassLibrary1::Class1 c;
    return c.Test1(i);
}

extern __declspec(dllexport) System::Void Test2(String^ txt) {
    ClassLibrary1::Class1 c;
    c.Test2(txt);   
}

我可以轻松导出 Add、Test 和 Test1 方法,但不能导出 Test2。

我该如何解决?

感谢支持

4

2 回答 2

2

AFAIK 您不能导出在参数或返回值中具有 C++/CLI 类型的方法。所以你必须使用 const wchar_t* 或 std::wstring 作为参数而不是 String^。

于 2019-02-15T11:42:06.553 回答
0

尝试在函数 Test2 中使用 gcroot<>,如下所示:

System::Void Test2(gcroot<String^> txt);
于 2020-06-10T03:56:30.547 回答