ネイティブc++クラスのC++/CLIラッパーに取り組んでいます。C ++/CLIラッパーはWPFアプリケーションで使用されています。文字列をマーシャリングしようとしたときに、奇妙な問題が発生しました。
WPFアプリケーションは、System::String
オブジェクトをラッパーに渡します。次に、ラッパーは、をネイティブクラスが期待するSystem::String
に変換します。std::string
これはすべてうまくいきますが、文字列をネイティブオブジェクトに渡すと、空になります。
ここにいくつかの関連するコードがあります
WPFイベントハンドラー(C#)
private void tbInputConfig_TextChanged(object sender, TextChangedEventArgs e)
{
_OrionBasicApp.ConfigTemplateFile = tbInputConfig.Text;
}
ラッパークラスのプロパティ(C ++ / CLI)
void BasicApp::ConfigTemplateFile::set(String ^value)
{
std::string val = marshal_as<std::string>(value);
_NativeApp->setConfigTemplateFile(val);
}
ネイティブコード(C ++)
void Basic_App::setConfigTemplateFile(const std::string& template_file)
{
m_gParams.configTemplateFile = template_file;
}
したがって、WPFアプリに侵入し、デバッガーを使用してトレースすると、Stringオブジェクトは正常に見え、std::string val
マーシャリングは良好に見えますtemplate_file
が、setConfigFile
関数のパラメーターは空の文字列です。ネイティブ関数からステップアウトすると、std::string val
変数はまだ正常に見えることがわかります。
Marshal::StringToHGlobalAnsi
関数を使ってみましたが、同じ結果になります。参照の代わりに文字列のコピーを取得するようにネイティブ関数を変更しようとしましたが、これにより、無効なメモリブロックに関する例外が発生します(要求された場合は、正確なメッセージを投稿します)。ヒープに文字列を割り当ててみましたが、運がありません。
ここで、キッカーの場合:ネイティブコードはMicrosoft Visual Studio 2008でコンパイルされ、ラッパー+ wpfコードは2010でコンパイルされました。どちらのコードベースも別のバージョンに移行するのは簡単ではないため、これが問題にならないことを願っています。 。
何か案は?
アップデート
ネイティブコードをVisualStudio2010に切り替えることができましたが、これで問題は解決しました。(なぜマイクロソフトは私の人生をとても難しくしなければならないのですか?)私がシステムを構築した間、プロジェクトのリードは私にこのソリューションについて大きな問題を与えています(彼はそれが正しく実行されないか、私たちが切り替える必要があるかもしれないと心配しています依存ライブラリ)。
それで、ビジュアルスタジオのバージョンを切り替えることを強制しないこの問題の解決策はありますか?