在C++ DLL或C++ exe上编写C#GUI

exc*_*ray 7 c# c++ dll

我有一个C++控制台Exe,它做了一些编程.现在我想编写一个C#GUI来完成C++ exe所做的一些编程.我想的方法很少,

  1. 用C++中的所有编程从头开始编写C#GUI.(我不想为它所需的返工量做这个)
  2. 构建一个C++ DLL进行编程并将其导入到GUI应用程序中.(现在我有一个问题.我如何在c ++ dll中捕获例程的输出并在GUI中显示它?我应该将输出作为字符串返回应用程序调用的每个例程.?因为我不知道托管c ++我将构建一个非托管的C++ DLL.)

Ben*_*igt 7

构建C++/CLI DLL真的不是那么难.您基本上使用非托管C++代码,除了您定义了一个" public ref class",它承载您希望C#代码看到的函数.

你回来了什么样的数据?单个数字,数字矩阵,复杂对象?

更新:由于已经澄清"输出"是iostreams,这里有一个项目演示重定向cout到调用库的.NET应用程序.在现有重定向之后重定向clogcerr仅需要少量额外的线条DllMain.

zip文件包含VS2010项目文件,但源代码也应该在2005或2008中使用.

iostreams捕获功能包含在以下代码中:

// compile this part without /clr
class capturebuf : public std::stringbuf
{
protected:
    virtual int sync()
    {
        // ensure NUL termination
        overflow(0);
        // send to .NET trace listeners
        loghelper(pbase());
        // clear buffer
        str(std::string());
        return __super::sync();
    }
};

BOOL WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)
{
    static std::streambuf* origbuf;
    static capturebuf* altbuf;
    switch (_Reason)
    {
    case DLL_PROCESS_ATTACH:
        origbuf = std::cout.rdbuf();
        std::cout.rdbuf(altbuf = new capturebuf());
        break;
    case DLL_PROCESS_DETACH:
        std::cout.rdbuf(origbuf);
        delete altbuf;
        break;
    }

    return TRUE;
}

// compile this helper function with /clr
void loghelper(char* msg) { Trace::Write(gcnew System::String(msg)); }
Run Code Online (Sandbox Code Playgroud)