Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

открыть C#.dll в C++

842
22 октября 2008 года
sigmov
301 / / 16.09.2008
Создаю 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;
    }
}


Затем динамически погружаю ее в проект 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;}
};


Но в итоге адрес pfn остается нулевым.

Видимо в С# dll особое пространство имен. Как мне вызвать эту функцию.
240
22 октября 2008 года
aks
2.5K / / 14.07.2006
Дело не в пространстве имен. dll на C# содержит MSIL-байт код, а не нативные команды. Соответсвенно исспользовать ее из C++ без .Net нельзя.
341
22 октября 2008 года
Der Meister
874 / / 21.12.2007
Да и GetProcAddress() для MSIL-сборок использовать низзя в принципе, они вообще не имеют таблиц экспорта. А ещё .NET-строки юникодовы.
Но никто не запрещает автору схостить MSIL-код в неуправляемом приложении на С++, дабы обратиться к System::Diagnostics, либо чтобы вызвать ту же GetProcessR() из C#-сборки по-человечески.
842
22 октября 2008 года
sigmov
301 / / 16.09.2008
Спасибо, AKS я понял что к чему.

И нашел как разрешить проблему - кому будет интересно ->

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();
    }
}


Вынимаем функцию в 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)();}
   
};
341
22 октября 2008 года
Der Meister
874 / / 21.12.2007
Как бы там ни было, мешанина из вычислительных платформ, в подавляющем большинстве случаев, ист них'т гут. Лучше, всё же, остановиться на какой-либо одной. В вашем случае, для получения списка процессов, достаточно было набора функций из <tlhelp32.h>
842
22 октября 2008 года
sigmov
301 / / 16.09.2008
Цитата: Der Meister
Как бы там ни было, мешанина из вычислительных платформ, в подавляющем большинстве случаев, ист них'т гут. Лучше, всё же, остановиться на какой-либо одной. В вашем случае, для получения списка процессов, достаточно было набора функций из <tlhelp32.h>



Полностью с вами согласен. И через <tlhelp32.h> даже быстрее будет. Это была просто попытка так сделать.:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог