Написать функцию на C# для программы на C++

265
09 декабря 2017, 05:27

У меня есть проект на С++, в котором мне надо делать выборки из WMI. Через C# это гораздо легче, поэтому хотел бы сделать с помощью него. По сути передавать мне надо будет строки, в которых будет имя компьютера, namespace, класс и название полей (3 - 4 на каждый класс), а возвращать контейнер пар типа <название поля, значение>. Как лучше всего это сделать, можно ли написать библиотеку на C# и использовать её в С++? Использовать C++/CLI вряд ли получится, слишком много переписывать придётся.

Answer 1

Я думаю, проще всего написать код на C#, и мелкую обёртку на C++/CLI.

Пример. Пусть у вас есть код на C#

public class QueryLibrary
{
    public Dictionary<string, string> RunQuery(string machineName, string className) { ... }
}

Вы создаёте обёртку на C++/CLI:

#include "stdafx.h"
#include <string>
#include <map>
#include <msclr\marshal.h>
#include <msclr\marshal_cppstd.h>
using namespace System;
using namespace System::Collections::Generic;
using namespace msclr::interop;
std::map<std::wstring, std::wstring> RunQuery(
    const std::wstring& machineName,
    const std::wstring& className)
{
    QueryLibrary^ ql = gcnew QueryLibrary();
    String^ machineNameMng = marshal_as<String^>(machineName);
    String^ classNameMng = marshal_as<String^>(className);
    Dictionary<String^, String^>^ result = ql->RunQuery(machineNameMng, classNameMng);
    std::map<std::wstring, std::wstring> resultMap;
    for each (KeyValuePair<String^, String^>^ kvp in result)
    {
        std::wstring key = marshal_as<std::wstring>(kvp->Key);
        std::wstring value = marshal_as<std::wstring>(kvp->Value);
        resultMap.insert(std::make_pair(key, value));
    }
    return resultMap;
}

Теперь у вас получается «нормальная» функция с нативной сигнатурой, можете её использовать в C++-коде.

Answer 2

Можно написать консольное приложение на C#, далее его вызывать из C++ кода, передавая нужные аргументы и читая результаты выполнения программы.

READ ALSO
Не редактируются .cshtml-файлы

Не редактируются .cshtml-файлы

После обновления VS 2017 Community Edition перестали редактироваться View-файлы (формата cshtml)Все остальные файлы редактируются как надо

177
Отталкивание врага

Отталкивание врага

Как можно при ударе оттолкнуть бота, который работает с помощью Nav Mesh AgentНужно помочь реализовать только отталкивание

224
SqliteException: database disk image is malformed

SqliteException: database disk image is malformed

Нужно загрузить бд под андроидВо время загрузки выдает вот эту ошибку SqliteException: database disk image is malformed

233