C#: Как получить доступ к static struct из C++ dll
От: newalex77  
Дата: 26.03.19 12:25
Оценка:
Есть с++ dll, в которой объявлена статическая структура вида:

typedef int (*reset)(void *context);

typedef int (*update)(void *context, const uint8_t *data, size_t length);

typedef int (*finalize)(void *context,uint8_t *digest);

typedef struct
{
reset reset;
update update;
finalize finalize;
size_t context_size;
size_t block_size;
size_t digest_si
} main_struct;

Как получить доступ к main_struct из C# ?

При попытках вида:
[DllImport(fileDLL)]
public static Main_struct main_struct;
компилятор выдает ошибку: Аttribute 'DllImport' is not valid on this declaration type. It is only valid on 'method' declarations.
c# dllimport static struct
Re: C#: Как получить доступ к static struct из C++ dll
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.03.19 13:14
Оценка:
Здравствуйте, newalex77, Вы писали:

https://stackoverflow.com/questions/17561699/how-to-get-an-intptr-to-a-struct
и солнце б утром не вставало, когда бы не было меня
Re[2]: C#: Как получить доступ к static struct из C++ dll
От: newalex77  
Дата: 26.03.19 15:22
Оценка:
Здравствуйте, Serginio1, Вы писали:


S>https://stackoverflow.com/questions/17561699/how-to-get-an-intptr-to-a-struct


В этой статье показано как использовать функцию из dll, в которую передается структура.
Мне надо получить доступ к статической структуре из dll (в которой есть указатели на функции).
Re: C#: Как получить доступ к static struct из C++ dll
От: Jack128  
Дата: 26.03.19 15:26
Оценка: 2 (1) +1
Здравствуйте, newalex77, Вы писали:

Насколько я понимаю указатель на экспортированую структуру можно получить через обычный GetProcAddress, так что LoadLibrary + GetProcAddress + Marshal.PtrToStructure.
Re: C#: Как получить доступ к static struct из C++ dll
От: Pavel Dvorkin Россия  
Дата: 26.03.19 15:42
Оценка: +2
Здравствуйте, newalex77, Вы писали:

N>Есть с++ dll, в которой объявлена статическая структура вида:


N>Как получить доступ к main_struct из C# ?


Сделать в DLL функцию, которая возвращает адрес этой структуры.
With best regards
Pavel Dvorkin
Re[3]: C#: Как получить доступ к static struct из C++ dll
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.03.19 15:59
Оценка:
Здравствуйте, newalex77, Вы писали:

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



S>>https://stackoverflow.com/questions/17561699/how-to-get-an-intptr-to-a-struct


N>В этой статье показано как использовать функцию из dll, в которую передается структура.

N>Мне надо получить доступ к статической структуре из dll (в которой есть указатели на функции).

Не совсем там показано копирование из объекта в нативную память и наоборот

private IntPtr MarshalToPointer(
    object data)
{
    IntPtr buf = Marshal.AllocHGlobal(
        Marshal.SizeOf(data));
    Marshal.StructureToPtr(data,
        buf, false);
    return buf;
}

This simply returns an IntPtr to an area of the global heap that contains a copy of the data. The only problem with this function is that you have to remember to release the allocated heap memory after use. For example:

IntPtr lpstruct =
    MarshalToPointer(Sinfo);
result = AVIFileCreateStream(pFile,
        ref pStream, lpstruct);
Marshal.FreeHGlobal(lpstruct);

…works exactly like default marshalling. But don’t forget that lpstruct is itself still being marshalled as a pass-by-value integer. To copy the result back to the struct an additional function is required:

private object MarshalToStruct(
        IntPtr buf,Type t)
{
    return Marshal.PtrToStructure(
        buf, t);



Доступ к структуре ты можешь получить через экспортируемые функции
и солнце б утром не вставало, когда бы не было меня
Re: C#: Как получить доступ к static struct из C++ dll
От: vajarkov  
Дата: 14.02.20 03:56
Оценка: -1
Здравствуйте, newalex77, Вы писали:

N>Есть с++ dll, в которой объявлена статическая структура вида:


N> typedef int (*reset)(void *context);


N> typedef int (*update)(void *context, const uint8_t *data, size_t length);


N> typedef int (*finalize)(void *context,uint8_t *digest);


N> typedef struct

N> {
N> reset reset;
N> update update;
N> finalize finalize;
N> size_t context_size;
N> size_t block_size;
N> size_t digest_si
N>} main_struct;

N>Как получить доступ к main_struct из C# ?


N>При попытках вида:

N> [DllImport(fileDLL)]
N> public static Main_struct main_struct;
N>компилятор выдает ошибку: Аttribute 'DllImport' is not valid on this declaration type. It is only valid on 'method' declarations.



До структуры ты не достучишься, можно только запустить метод или функцию, структуры придется объявлять самому
Re: C#: Как получить доступ к static struct из C++ dll
От: vajarkov  
Дата: 14.02.20 03:57
Оценка:
Здравствуйте, newalex77, Вы писали:

N>Есть с++ dll, в которой объявлена статическая структура вида:


N> typedef int (*reset)(void *context);


N> typedef int (*update)(void *context, const uint8_t *data, size_t length);


N> typedef int (*finalize)(void *context,uint8_t *digest);


N> typedef struct

N> {
N> reset reset;
N> update update;
N> finalize finalize;
N> size_t context_size;
N> size_t block_size;
N> size_t digest_si
N>} main_struct;

N>Как получить доступ к main_struct из C# ?


N>При попытках вида:

N> [DllImport(fileDLL)]
N> public static Main_struct main_struct;
N>компилятор выдает ошибку: Аttribute 'DllImport' is not valid on this declaration type. It is only valid on 'method' declarations.


Структуры придется объявлять самому в C#, чем я сейчас и занимаюсь. Из DLL доступны методы и функции
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.