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