CLI / C++を介してC++からC#関数を呼び出したい。
C#コード
private string _text = " ";
public void setText(string text)
{
// _text = text;
_text = "HI World";
}
理想的には、setTextにはコメント行のみを含める必要があります。_text="HIWorld"はその一例です。
public string getText()
{
return _text;
}
C ++/CLIコード
ヘッダー:
gcroot<Bridge> _managedObject;
virtual void setText(std::string text);
virtual std::string getText();
CPPファイル
std::string CStringBridge::getText()
{
// _managedObject = gcnew Bridge(); return(marshal_as(_managedObject-> getText())); }
void CStringBridge::setText(std::string text)
{
// _managedObject = gcnew Bridge(); _managedObject-> setText(gcnew System :: String(text.c_str())); }
IStringBridgeWrapper* IStringBridgeWrapper::CreateInstance(void)
{
return ((IStringBridgeWrapper *)new CStringBridge());
}
注:次のコードを使用する場合
virtual void setText(System::String^ text);
virtual System::String^ getText();
次のエラーが発生します3395
* __ declspec(dllexport)は、__clrcall呼び出し規約のある関数には適用できません*
、そして私はstd::stringに固執しました
C ++ / CLIコードからライブラリを使用し、C ++プログラムから呼び出すと、「HiWorld」が出力されます。代わりに何も印刷されません
C++コンソールアプリケーション
IStringBridgeWrapper *pBridge = IStringBridgeWrapper::CreateInstance();
pBridge->setText(std::string("I am here"));
pBridge->getText();
文字列が正しく渡されていないと思います。
それを解決するためのアイデアはありがたいです。
編集
コメントの後にコードを更新しましたが、何も表示されません。
gcrootはハンドルを作成しますが、それにメモリを割り当てません。ただし、Bridgeにはメモリが割り当てられていないため、アプリケーションは機能しません。私のコードは、こちらの記事の同じ行にあります-http ://www.codeproject.com/Articles/10020/Using-managed-code-in-an- unmanaged-application。