通过C ++ / CLI公开托管C#

时间:2017-08-28 02:28:01

标签: c# c++ c++-cli

我用/ clr编译了这个C ++ / CLI代码。

// CppBridge.cpp : Defines the entry point for the console application.


#include "stdafx.h"
#using <mscorlib.dll>


using namespace System;
using namespace EmulatorLibrary;

using namespace std;

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT const char* exportedCall()
{

    return "exportedCall";
}


public ref class DelegateCLI
{
  private:

  EmulatorDelegate^ emulatorDelegate;

  public:

  DelegateCLI() {

    emulatorDelegate = gcnew EmulatorDelegate();
  }

  String^  callTest() {

    return emulatorDelegate->test();

  }

};

能够致电

exportedCall() 
来自JNI和Java的

。我目前没有Java问题。

但是现在我需要通过公开它来调用 callTest()。该方法仍然是C ++ / CLI。不是吗?我见过对 gcroot 的引用,但没有完全理解实现此目的的过程。

如何在此C ++ / CLI层中导出 callTest()

更新1:我找到了https://msdn.microsoft.com/en-us/library/c320cx3h.aspx,我正试图破译它。

这不应该有用。

extern "C" {
__declspec(dllexport)
    String^ exportedCall1() {
    EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate();
    return emulatorDelegate->test();

}
}

更新2:我正在探索https://msdn.microsoft.com/en-us/library/481fa11f(v=vs.80).aspx。但我需要导出一个函数,该函数返回由托管函数返回的String。

这是我最好的尝试。编译为DLL。应该管用。对 ?必须测试。

 class Unmanaged {
 public:
    gcroot<String^> interopstring;
    Unmanaged() {}
 };

EXTERN_DLL_EXPORT const char* exportedInteropCall()
{

EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate();
Unmanaged u;
u.interopstring = emulatorDelegate->test();
return (const char*)
(Marshal::StringToHGlobalAnsi(u.interopstring)).ToPointer(); // "exportedCall";
}

1 个答案:

答案 0 :(得分:0)

这段代码就是我追求的。我已经在调试模式下执行了.exe并进行了测试。我可以从C ++ / CLI层调用C#代码。

class Unmanaged {
public:
gcroot<String^> interopstring;
Unmanaged() {}
};

EXTERN_DLL_EXPORT const char* exportedInteropCall()
{  
    EmulatorDelegate^ emulatorDelegate = gcnew EmulatorDelegate();
    Unmanaged u;
    u.interopstring = emulatorDelegate->test();
    return (const char*)
    (Marshal::StringToHGlobalAnsi(u.interopstring)).ToPointer(); // "exportedCall";
}