2

私は単純なc++アプリケーションを持っています。このアプリケーションは、テキストを印刷しているだけです。また、複雑なxmlファイルを解析し、値を抽出してリストに保存するac#.dllNET3.5もあります。4つのメソッドを持つ2つのクラスのようなものです。彼らはファイルを開き、xmlを解析し、それをリストに保存します。c#.dllが完了すると、10000個の値を持つリストが作成されます。

複雑な解析XMLをc++で記述したくないので、c#xml解析.dllを使用したいと思います。

c ++アプリケーション内からc#.dllを呼び出し、c#.dllに指定されたxmlファイルを解析させ、解析されたxml値とともに作成されたリストをc ++アプリケーションに返すことは可能ですか?

私のc++アプリケーションでは、返されたリスト内のデータの変更に進みます。

編集:私はvc ++を使用します(Microsoft Visual Studio 2010)

edit2:vc ++アプリは、別のより大きなアプリケーションへの拡張/プラグインになります。その大きなアプリケーションにプラグインを登録すると、メニューのアイコンを押すたびに、vc++アプリケーションが起動します。

edit3:誰かがそのようなタスクを経験したことがありますか?可能であれば、明確な「はい」または「いいえ」が必要です。

edit4:.net.dllによって書き込まれたファイルを読み取らないようにします。C++アプリで.net.dllに文字列を送信し、リスト/配列オブジェクトを受信するようにします。または、これは悪い考えであり、c ++自体でxml解析を行う必要がありますか?

4

2 に答える 2

3

はい、できますが、ちょっと大変です。これを行う1つの方法は、C ++を使用してCLRをロードし、関数を実行することです。次のようになります。

Blizzhackers.ccに触発されたコード

void StartNET()
{
   DWORD result;
   ICLRRuntimeHost* pCLR = NULL;

   CorBindToRuntimeEx(NULL, L"wks", NULL, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pCLR);
   pCLR->Start();

   pCLR->ExecuteInDefaultAppDomain(L"C:\\myNET.dll", L"myNet.Program", L"Main", L"arg", &result);

   pCLR->Stop();
}

このC++コードは、とint Main(string arg)から関数を実行します。つまり、次のようになります。namespace myNetclass Program

myNET.dll:

namespace myNet
{
     class Program
     {
            int Main(string arg)
            {
                    //and here you can run your XML parser:

                    List<string> myList = XMLParse();

                    FileStream fs = new Filestream("xmllist.txt");
                    StreamWriter sw = new StreamWriter(fs);

                    foreach(string s in myList)
                         sw.WriteLine(s);

                    sw.Close();
                    fs.Close();

                    return 1;
            }

            List<string> XMLParse()
            {
                    //Your code here
                    return aList;
            }
     }

}

この後、c++を使用してxmllist.txtからファイルを取得できます。

vector<char[]> getList()
{
      vector<char[]> *myVector = new vector<char>;
      ifstream cin("xmllist.txt");
      while(!cin.eof())
      {
          char line[100];
          cin >> line;
          myVector.push(line);
      }
      cin.close();
      return myVector;
}

この最後の関数が機能するかどうかはわかりませんが、一般的な考え方はわかります。

于 2012-08-25T10:48:46.287 に答える
1

少し前にC++でマネージド/アンマネージドdllを作成しました。(ただし、C ++。netには最も簡単な構文がないことに注意してください。)

実際、今どこから始めればよいのかわかりません。おそらく、http://channel9.msdn.com/Forums/TechOff/101918-Mixing-Managed-and-Unmanaged-C-in-a-DLLの情報があります。それは確かに可能でした..VS2005?これにより、アンマネージコードを1つのバイナリ/アセンブリで両方管理できるため、C#dllを呼び出すことができます。

それとは別に、C#オブジェクトをCOMオブジェクトとしてラップすることができます。http://msdn.microsoft.com/en-us/library/ms404285.aspx。次に、COM相互運用機能を使用できます。

いずれの場合も、入力/出力のマーシャリングには試行錯誤が必要です。これまでに行ったことがないかどうかは明らかではありません。

実際には、このリンクですべてをカバーする必要があります:http: //msdn.microsoft.com/en-us/library/ms973872.aspx

于 2012-08-24T11:49:24.207 に答える