Передача параметров .NET методу через UnmanagedAPI из Native
От: vim  
Дата: 19.12.07 16:46
Оценка:
Проблема состоит в следующем, нужно из native-кода вызывать методы .NET сборки передавая им параметры и соответсвенно получая результат работы. Но вот не задача никак не соображу как это сделать, т.к. интерфейс Unmanaged API просто ужасно задокументирован .

Пытаюсь сейчас делать это как-то, но пока не получается передать больше одного параметра:
    ApplicDomain->Load_3(psArr, &Ass);
    Ass->GetType_2((CComBSTR) (TypeName),&Type);
    Type->GetMethod_6((CComBSTR) MethodFullName, &Method);
        ...
    AFEARRAY* arguments = SafeArrayCreateVector(VT_VARIANT, 0, 1);    
        ...
        Ass->CreateInstance((CComBSTR) TypeName, &varr);
    SAFEARRAY * RetVal;
    Method->GetParameters(&RetVal);
    _ParameterInfo * Param;
    hr = Method->Invoke_3(varr, arguments, Test);
        ...



Может уважаемы all уже встречаслся с подобной проблемой и скажет куда смотреть или может есть ссылки по данной теме, вообщем любой инфе которая поможет продвинуться в этом не легком деле буду крайне признателен.
Re: Передача параметров .NET методу через UnmanagedAPI из Na
От: agos Россия http://trtrmitya.wordpress.com
Дата: 19.12.07 17:31
Оценка:
Здравствуйте, vim, Вы писали:

vim>Проблема состоит в следующем, нужно из native-кода вызывать методы .NET сборки передавая им параметры и соответсвенно получая результат работы. Но вот не задача никак не соображу как это сделать, т.к. интерфейс Unmanaged API просто ужасно задокументирован .

<поскипано>
вам же вроде ответили здесь
Автор: desco
Дата: 30.10.07

если это проблему не решает, то покажите вызываемый код
Не переходите улицу на тот свет..
Re[2]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 19.12.07 20:19
Оценка:
Тут другая ситуация, в том случае все решено и тема закрыта. В данном случае не идет речь о создании домена и просто выполнения кода в нем, тут стоит задача вызвать конкретный managed метод из native среды и передача ему аргументов, а после этого еще и от следить возвращаемые им параметры.
Re[3]: Передача параметров .NET методу через UnmanagedAPI из
От: agos Россия http://trtrmitya.wordpress.com
Дата: 19.12.07 20:31
Оценка:
Здравствуйте, vim, Вы писали:

vim>Тут другая ситуация, в том случае все решено и тема закрыта. В данном случае не идет речь о создании домена и просто выполнения кода в нем, тут стоит задача вызвать конкретный managed метод из native среды и передача ему аргументов, а после этого еще и от следить возвращаемые им параметры.

хм, но там же параметры передаются
это разве не то, что вам надо?
Не переходите улицу на тот свет..
Re[4]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 19.12.07 20:43
Оценка:
В той ситуации на которую вы привели ссылку хост создается через CorRuntimeBindEx() и там была проблема передачи параметров, она уже решена спасибо всем откликнувшимся.
В данной ситуации осуществляется попытка вызова managed метода из native среды и даже большая проблема не передачи параметров, а получения возвращаемого значения.Вот вопрос и заключается в том, что может кто делал что то подобное и может ткнуть носом, куда копать, а то что то затык какой то блин.
Re[5]: Передача параметров .NET методу через UnmanagedAPI из
От: agos Россия http://trtrmitya.wordpress.com
Дата: 19.12.07 21:17
Оценка:
Здравствуйте, vim, Вы писали:

vim>В той ситуации на которую вы привели ссылку хост создается через CorRuntimeBindEx() и там была проблема передачи параметров, она уже решена спасибо всем откликнувшимся.


а сейчас не через CorBindToRuntimeEx?

vim>В данной ситуации осуществляется попытка вызова managed метода из native среды и даже большая проблема не передачи параметров, а получения возвращаемого значения.

в начальном посте упор был больше на параметры, я подумал, что проблема именно с этим

vim>Вот вопрос и заключается в том, что может кто делал что то подобное и может ткнуть носом, куда копать, а то что то затык какой то блин.

я делал
приведите сигнатуру вашего управляемого кода, и побольше кода как вы его вызываете
Не переходите улицу на тот свет..
Re[6]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 20.12.07 10:04
Оценка:
Сейчас пытаюсь понять общую концепцию работы с управляемой средой из неуправляемой. Вот через ниже приведенный код получается передать только один параметр, а через GetParametrs() пытаюсь получить возвращаемое значение, но почему то значение всегда пустое приходит. Вопрос на самом деле в следующим как корректно обработать возвращаемые значения и передавать сложные типы (объекты структуры) из неуправляемого кода в управляемый.

    ApplicDomain->Load_3(psArr, &Ass);
    Ass->GetType_2((CComBSTR) (TypeName),&Type);
    Type->GetMethod_6((CComBSTR) MethodFullName, &Method);
        ...
    AFEARRAY* arguments = SafeArrayCreateVector(VT_VARIANT, 0, 1);    
        ...
    Ass->CreateInstance((CComBSTR) TypeName, &varr);
    SAFEARRAY * RetVal;
    Method->GetParameters(&RetVal);
    _ParameterInfo * Param;
    hr = Method->Invoke_3(varr, arguments, Test);
        ...
Re[7]: Передача параметров .NET методу через UnmanagedAPI из
От: agos Россия http://trtrmitya.wordpress.com
Дата: 20.12.07 13:49
Оценка:
Здравствуйте, vim, Вы писали:

вот набросал на скорую руку (получает два параметра, возвращает 1)
ошибки не проверяются, память подтекает и завершается неправильно
// clrhosttest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <mscoree.h>

#pragma comment(lib, "mscoree.lib")

#import <mscorlib.tlb> raw_interfaces_only high_property_prefixes("_get","_put","_putref") rename("ReportEvent", "StdReportEvent") rename("_DSA", "_CLR_DSA")

using namespace mscorlib;


int _tmain(int argc, _TCHAR* argv[])
{
    ICorRuntimeHost *pCorRuntimeHost = NULL;

    HRESULT g_hLastError = CorBindToRuntimeEx(L"v2.0.50727", L"wks",
        STARTUP_LOADER_OPTIMIZATION_SINGLE_DOMAIN | STARTUP_CONCURRENT_GC,
        CLSID_CorRuntimeHost, IID_ICorRuntimeHost,
        (void **)&pCorRuntimeHost);

    g_hLastError = pCorRuntimeHost->Start();


    IUnknown *pUnkDomain = NULL;
    _AppDomain *pAppDomain = NULL;

    g_hLastError = pCorRuntimeHost->GetDefaultDomain((IUnknown**)&pUnkDomain);
    g_hLastError = pUnkDomain->QueryInterface(__uuidof(_AppDomain), (void**) &pAppDomain);

    _Assembly *pAssembly = NULL;
    BSTR bstrAssemblyString = SysAllocString(L"ClassLibrary1");
    
    g_hLastError = pAppDomain->Load_2(bstrAssemblyString, &pAssembly);
    
    SysFreeString(bstrAssemblyString);

    _Type *pType = NULL;

    BSTR typeString = SysAllocString(L"ClassLibrary1.Class1");
    VARIANT obj;
    g_hLastError = pAssembly->GetType_2(typeString, &pType);
    g_hLastError = pAssembly->CreateInstance(typeString, &obj);
    SysFreeString(typeString);

    VARIANT retVal;

    SAFEARRAY* safeArgs = SafeArrayCreateVector(VT_VARIANT, 0, 2);

    VARIANT vt;
    VariantInit(&vt);
    vt.vt = VT_BSTR;
    LONG ind = 0;
    vt.bstrVal = SysAllocString(L"568");
    g_hLastError = SafeArrayPutElement(safeArgs, &ind, &vt);

    VariantInit(&vt);
    vt.vt = VT_INT;
    vt.intVal = 45;
    ind = 1;
    g_hLastError = SafeArrayPutElement(safeArgs, &ind, &vt);

    BSTR methodString = SysAllocString(L"Test");
    g_hLastError = pType->InvokeMember_3(methodString, (BindingFlags)(BindingFlags_InvokeMethod | BindingFlags_Public | BindingFlags_Instance), NULL, obj, safeArgs, &retVal);
    SysFreeString(methodString);

    printf("%d", retVal.intVal);


    return 0;
}



namespace ClassLibrary1
{
    public class Class1
    {
        public Class1()
        {
        }

        public int Test(string s, int k)
        {
            return int.Parse(s) + k;
        }
    }
}



PS. в своем проекте я делаю хост базе ICLRRuntimeHost, IHostControl и AppDomainManager, и вам того же советую
Не переходите улицу на тот свет..
Re[8]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 20.12.07 15:05
Оценка:
Спасибо большое за пример, сейчас буду разбираться.

А есть какая-нибудь инфа по теме в интете или может в книжке какой, просто хочется разобраться с этим вопросом уже для себя.
Re[9]: Передача параметров .NET методу через UnmanagedAPI из
От: agos Россия http://trtrmitya.wordpress.com
Дата: 20.12.07 17:43
Оценка:
Здравствуйте, vim, Вы писали:

vim>Спасибо большое за пример, сейчас буду разбираться.


vim>А есть какая-нибудь инфа по теме в интете или может в книжке какой, просто хочется разобраться с этим вопросом уже для себя.

Hosting (Unmanaged API Reference), также есть книга Customizing the Microsoft® .NET Framework Common Language Runtime.
Ну и просто поискать в инете по CorBindToRuntimeEx.
Не переходите улицу на тот свет..
Re[10]: Передача параметров .NET методу через UnmanagedAPI и
От: CodeWolf  
Дата: 20.12.07 18:31
Оценка:
Здравствуйте, agos, Вы писали:

A>Здравствуйте, vim, Вы писали:


vim>>Спасибо большое за пример, сейчас буду разбираться.


vim>>А есть какая-нибудь инфа по теме в интете или может в книжке какой, просто хочется разобраться с этим вопросом уже для себя.

A>Hosting (Unmanaged API Reference), также есть книга Customizing the Microsoft® .NET Framework Common Language Runtime.
A>Ну и просто поискать в инете по CorBindToRuntimeEx.
К стати Уважаемые, если использовать загрузку библиотеки при помощи Load_3, то есть как массив байт, то почему то все что было написано не работает, интересно понять почему, заранее благодарен за ответы
Re: Передача параметров .NET методу через UnmanagedAPI из Na
От: vim  
Дата: 21.12.07 12:10
Оценка:
Сапсибо вам большое за помощь, но у меня возник еще такой вопрос, а как передать в качестве параметра не простой тип (строки, целые числа, ...), а объект или структуру и вернуть обработанный в качестве возвращаемого параметра.

То есть создаем экземпляр объекта в Native части передаем его в качестве параметра Managed методу, после обработки managed кодом возвращаем обратна в native часть, можно как то решить эту проблему или так нельзя сделать в принципе ???
Re[2]: Передача параметров .NET методу через UnmanagedAPI из
От: Аноним  
Дата: 21.12.07 13:37
Оценка:
Здравствуйте, vim, Вы писали:

vim>Сапсибо вам большое за помощь, но у меня возник еще такой вопрос, а как передать в качестве параметра не простой тип (строки, целые числа, ...), а объект или структуру и вернуть обработанный в качестве возвращаемого параметра.


vim>То есть создаем экземпляр объекта в Native части передаем его в качестве параметра Managed методу, после обработки managed кодом возвращаем обратна в native часть, можно как то решить эту проблему или так нельзя сделать в принципе ???

Можно конечно, проще всего сделать через ComVisible объекты
Re[3]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 21.12.07 13:45
Оценка:
В данном конкретном случае использование атрибута ComVisible неприемлимо, поэтому интересно как это можно реализовать по средствам использования Unmanaged API, как в примере приведенном выше для простых типов.
Re[4]: Передача параметров .NET методу через UnmanagedAPI из
От: agos Россия http://trtrmitya.wordpress.com
Дата: 21.12.07 14:57
Оценка:
Здравствуйте, vim, Вы писали:

vim>В данном конкретном случае использование атрибута ComVisible неприемлимо, поэтому интересно как это можно реализовать по средствам использования Unmanaged API, как в примере приведенном выше для простых типов.

Тогда лучше на .Net сделать ComVisible обёртку над тем кодом, где "использование атрибута ComVisible неприемлимо". И работать с ней чере интерфейсы.
Если уж и этот вариант не подходит, то тогда, видимо, остаётся делать через VARIANT и SafeArray.
Не переходите улицу на тот свет..
Re[5]: Передача параметров .NET методу через UnmanagedAPI из
От: vim  
Дата: 21.12.07 15:04
Оценка:
ОК, спасибо за совет надо попробовать.
Если есть примерчик было совсем замечательно .
Re[10]: Передача параметров .NET методу через UnmanagedAPI и
От: CodeWolf  
Дата: 24.12.07 12:14
Оценка:
Доброго всем времени суток, на мой взгляд достаточно интересная беседа, по этому хотел бы включится в разговор, вот с передаче таким образом простых типов все ясно, а вот как передавать типы вида Point/StreamReader и прочие, которые являются стандартными для C#, но при этом не имеют аналогов в неуправляемом коде?
Заранее благодарен за ответы, спасибо.
Re[11]: Передача параметров .NET методу через UnmanagedAPI и
От: agos Россия http://trtrmitya.wordpress.com
Дата: 24.12.07 12:39
Оценка:
Здравствуйте, CodeWolf, Вы писали:

CW>а вот как передавать типы вида Point/StreamReader и прочие, которые являются стандартными для C#, но при этом не имеют аналогов в неуправляемом коде?

Честно говоря проблем не вижу, т.к., вроде бы, вся BCL ComVisible (уж StreamReader точно). Просто работайте как с COM объектами.
Расскажите что вы делаете, может есть и проще способы чем в нативном коде работать с .Net объектами, хотя и тут ничего особенного нету, главное за ресурсами следить.
Не переходите улицу на тот свет..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.