2

我有一个简单的 c++ 应用程序。此应用程序只是打印文本。我还有 ac# .dll NET 3.5,它解析复杂的 xml 文件,提取值并将它们保存到列表中。它就像 2 个具有 4 种方法的类。他们打开一个文件,解析 xml 并将其存储到一个列表中。当 c# .dll 完成后,它有一个包含 10000 个值的列表;

由于我不想用 c++ 编写复杂的解析 XML,我想使用我的 c# xml 解析 .dll。

我是否可以从我的 c++ 应用程序中调用我的 c# .dll,让 c# .dll 解析指定的 xml 文件,然后将创建的列表连同解析的 xml 值返回给我的 c++ 应用程序?

在我的 c++ 应用程序中,我将继续修改返回列表中的数据。

编辑:我将使用 vc++(Microsoft Visual Studio 2010)

edit2:vc++ 应用程序将是另一个更大应用程序的扩展/插件。我会将插件注册到那个更大的应用程序中,每次我按下菜单中的图标时,我的 vc++ 应用程序都会启动

编辑3:有没有人经历过这样的任务?如果可能的话,我有点需要明确的是或否。

edit4:我确实想避免读取由我的 .net .dll 编写的文件。我希望我的 c++ 应用程序向我的 .net .dll 发送一个字符串并接收一个列表/数组对象。或者这是一个坏主意,我应该在 C++ 本身中进行 xml 解析?

4

2 回答 2

3

是的,你可以做到,但有点难。一种方法是使用 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。这当然很可能与.. VS 2005?这样,您就可以在一个二进制/程序集中管理非托管代码,从而调用 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 回答