У меня есть код C, который я хочу вызвать из C#.
Нет необходимости раскрывать структуры данных C C#, поэтому C# может просто передавать на них указатели.
Основная идея заключается в том, чтобы заставить C# решить, что делать, приказать C сделать это, а затем сообщить о результатах - C# не обязательно много знать о том, что делает C.
Например, в C у меня есть
__declspec(dllexport) long cs_getB() {
return &B;
}
__declspec(dllexport) int cs_order(long csa) {
c_struct a = (c_struct *)csa;
return order(a);
}
int order(c_struct a)
{
// implementation
return 0;
}
а затем я делаю это на C#
[DllImport("C:\\whatever.dll", EntryPoint = "cs_getB", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetB();
[DllImport("C:\\whatever.dll", EntryPoint = "cs_order", CallingConvention = CallingConvention.StdCall)]
public static extern int Order(IntPtr a);
и
IntPtr b = MyDll.GetB()
int bor = MyDll.Order(b);
но вызов MyDll.Order выдает
System.AccessViolationException: 'Попытка прочитать или защищенная от записи память. Это часто указывает на то, что другая память повреждена.'
Правильен ли этот подход?
Как я могу заставить C# обрабатывать (указатели на ) данные из C и сообщить C, что с ними делать?
Обновить
То же самое, используя long long и intptr_t в C.
Значение типа IntPtr, возвращаемое в C#, равно 0x00007ffef6de8750.
VisualStudio не будет входить в код C.
__declspec(dllexport) intptr_t getB() {
return &B;
}
где
struct thingy {
long* m729;
...
};
typedef struct thingy* thing;
thing B;
Подробнее здесь: https://stackoverflow.com/questions/791 ... om-c-sharp
Передача указателей при вызове кода C из C# ⇐ C#
Место общения программистов C#
-
Anonymous
1730376879
Anonymous
У меня есть код C, который я хочу вызвать из C#.
Нет необходимости раскрывать структуры данных C C#, поэтому C# может просто передавать на них указатели.
Основная идея заключается в том, чтобы заставить C# решить, что делать, приказать C сделать это, а затем сообщить о результатах - C# не обязательно много знать о том, что делает C.
Например, в C у меня есть
__declspec(dllexport) long cs_getB() {
return &B;
}
__declspec(dllexport) int cs_order(long csa) {
c_struct a = (c_struct *)csa;
return order(a);
}
int order(c_struct a)
{
// implementation
return 0;
}
а затем я делаю это на C#
[DllImport("C:\\whatever.dll", EntryPoint = "cs_getB", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetB();
[DllImport("C:\\whatever.dll", EntryPoint = "cs_order", CallingConvention = CallingConvention.StdCall)]
public static extern int Order(IntPtr a);
и
IntPtr b = MyDll.GetB()
int bor = MyDll.Order(b);
но вызов MyDll.Order выдает
System.AccessViolationException: 'Попытка прочитать или защищенная от записи память. Это часто указывает на то, что другая память повреждена.'
Правильен ли этот подход?
Как я могу заставить C# обрабатывать (указатели на ) данные из C и сообщить C, что с ними делать?
[b]Обновить[/b]
То же самое, используя long long и intptr_t в C.
Значение типа IntPtr, возвращаемое в C#, равно 0x00007ffef6de8750.
VisualStudio не будет входить в код C.
__declspec(dllexport) intptr_t getB() {
return &B;
}
где
struct thingy {
long* m729;
...
};
typedef struct thingy* thing;
thing B;
Подробнее здесь: [url]https://stackoverflow.com/questions/79142121/passing-pointers-when-calling-c-code-from-c-sharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия