открыть C#.dll в C++
Затем пробую использовать ее функции в С++, подгрузив динамически.
Код DLL на C#:
Код:
using System;
using System.Runtime.InteropServices;
public class DllProcessR
{
public static string GetProcessR()
{
string str="";
System.Diagnostics.Process[] Proc= System.Diagnostics.Process.GetProcesses();
foreach(System.Diagnostics.Process proc in Proc)
{ str+=proc.ProcessName+"\n"; }
return str;
}
}
using System.Runtime.InteropServices;
public class DllProcessR
{
public static string GetProcessR()
{
string str="";
System.Diagnostics.Process[] Proc= System.Diagnostics.Process.GetProcesses();
foreach(System.Diagnostics.Process proc in Proc)
{ str+=proc.ProcessName+"\n"; }
return str;
}
}
Затем динамически погружаю ее в проект C++ и пытаюсь получить указатель на функцию GetProcessR() в DLL.
Код:
char* (*pfn)();
class DllProcessR{
protected:
bool Active;
HMODULE hLib;
public:
DllProcessR(){
if ((hLib=::LoadLibrary("DllProcessR.dll"))==NULL) Active=false;
else Active=true;
(FARPROC &)pfn = GetProcAddress(hLib, "GetProcessR");
}
~DllProcessR(){ FreeLibrary(hLib);}
bool GetActive(){return Active;}
};
class DllProcessR{
protected:
bool Active;
HMODULE hLib;
public:
DllProcessR(){
if ((hLib=::LoadLibrary("DllProcessR.dll"))==NULL) Active=false;
else Active=true;
(FARPROC &)pfn = GetProcAddress(hLib, "GetProcessR");
}
~DllProcessR(){ FreeLibrary(hLib);}
bool GetActive(){return Active;}
};
Но в итоге адрес pfn остается нулевым.
Видимо в С# dll особое пространство имен. Как мне вызвать эту функцию.
Дело не в пространстве имен. dll на C# содержит MSIL-байт код, а не нативные команды. Соответсвенно исспользовать ее из C++ без .Net нельзя.
Но никто не запрещает автору схостить MSIL-код в неуправляемом приложении на С++, дабы обратиться к System::Diagnostics, либо чтобы вызвать ту же GetProcessR() из C#-сборки по-человечески.
И нашел как разрешить проблему - кому будет интересно ->
Dll создаем на C++.NET:
Код:
#pragma once
#using <mscorlib.dll>
using namespace System;
extern "C"
{
__declspec(dllexport)
System::String* GetProcessC(){
System::Text::StringBuilder *str= new System::Text::StringBuilder();
System::Diagnostics::Process *Proc[]=System::Diagnostics::Process::GetProcesses();
for (int i=0;i<Proc->Length;i++){
str->Insert(str->Length,Proc->ProcessName);
}
return str->ToString();
}
}
#using <mscorlib.dll>
using namespace System;
extern "C"
{
__declspec(dllexport)
System::String* GetProcessC(){
System::Text::StringBuilder *str= new System::Text::StringBuilder();
System::Diagnostics::Process *Proc[]=System::Diagnostics::Process::GetProcesses();
for (int i=0;i<Proc->Length;i++){
str->Insert(str->Length,Proc->ProcessName);
}
return str->ToString();
}
}
Вынимаем функцию в C++
Код:
//Прототипы функций
WCHAR* (*pfnGetProcessC)();
//Класс Импорта
class DllProcessC{
protected:
bool Active;
HMODULE hLib;
public:
DllProcessC(){
if ((hLib=::LoadLibrary("DllProcessC.dll"))==NULL) Active=false;
else Active=true;
(FARPROC &)pfnGetProcessC = GetProcAddress(hLib, "GetProcessC");
}
~DllProcessC(){ FreeLibrary(hLib);}
bool GetActive(){return Active;}
//Получить список процессов
WCHAR* GetProcessC(){return (*pfnGetProcessC)();}
};
WCHAR* (*pfnGetProcessC)();
//Класс Импорта
class DllProcessC{
protected:
bool Active;
HMODULE hLib;
public:
DllProcessC(){
if ((hLib=::LoadLibrary("DllProcessC.dll"))==NULL) Active=false;
else Active=true;
(FARPROC &)pfnGetProcessC = GetProcAddress(hLib, "GetProcessC");
}
~DllProcessC(){ FreeLibrary(hLib);}
bool GetActive(){return Active;}
//Получить список процессов
WCHAR* GetProcessC(){return (*pfnGetProcessC)();}
};
Как бы там ни было, мешанина из вычислительных платформ, в подавляющем большинстве случаев, ист них'т гут. Лучше, всё же, остановиться на какой-либо одной. В вашем случае, для получения списка процессов, достаточно было набора функций из <tlhelp32.h>
Цитата: Der Meister
Как бы там ни было, мешанина из вычислительных платформ, в подавляющем большинстве случаев, ист них'т гут. Лучше, всё же, остановиться на какой-либо одной. В вашем случае, для получения списка процессов, достаточно было набора функций из <tlhelp32.h>
Полностью с вами согласен. И через <tlhelp32.h> даже быстрее будет. Это была просто попытка так сделать.:)