Unmanaged и managed
От: Аноним  
Дата: 27.05.05 13:08
Оценка:
Каково концептуально типовое решение для такой связки?

Импорт АПИ-функций мне не нравится. Для решения какой-нибудь задачи типа внедрения dll в адресное пространство чужого процесса или работа с хуками клавы\мыши куда приятнее пользоваться родным кодом, чем импортировать кучу функций. Допустим, для последней задачи можно использовать Managed DX, но не всегда все так просто.

Самое простое — сделать COM-объект Stuff, реализовать в нем все, что надо, и пользоваться через Interop (дает комовский реюз, помимо прочего). Еще можно написать managed компоненту на MC++.

А нет ли способа смешивать в одном csproj'е код шарпа и код MC++, чтобы __gc-классы предоставляли интерфейс для вызовов из шарпа с unmanaged-имплементацией (WinAPI)? Может, решение очевидно, но я не дотумкал?
Re: Unmanaged и managed
От: Mab Россия http://shade.msu.ru/~mab
Дата: 27.05.05 15:01
Оценка:
А>Для решения какой-нибудь задачи типа внедрения dll в адресное пространство чужого процесса или работа с хуками клавы\мыши куда приятнее пользоваться родным кодом, чем импортировать кучу функций.
С трудом представляю, как для задачи внедрения можно применить managed code. Разве что внедрить загрузчик, поднять там хост и далее загружать сборку с managed кодом. Только вот зачем все это?

А>Самое простое — сделать COM-объект Stuff, реализовать в нем все, что надо, и пользоваться через Interop (дает комовский реюз, помимо прочего).

Честно говоря, простота такого решения кажется обманчивой. Ничего кроме написания лишнего кода я хорошего в COMе не вижу, и развития его не предвидится. Реюз же хорош ровно в том случае, если изначально нужен COM-объект (скажем, для использования в legacy коде). Делать же новое приложение на COMе непонятно зачем надо.

А>Еще можно написать managed компоненту на MC++.

Компоненту -- в смысле класс? Да можно. Подходящее по затратам решение, если API сложное и на C# через pinvoke тяжело получается.

А>А нет ли способа смешивать в одном csproj'е код шарпа и код MC++

csproj -- это c# project file. Конечно, он не может содержать код на MC++.
Re[2]: Unmanaged и managed
От: Аноним  
Дата: 27.05.05 15:58
Оценка:
Здравствуйте, Mab, Вы писали:

А>>Для решения какой-нибудь задачи типа внедрения dll в адресное пространство чужого процесса или работа с хуками клавы\мыши куда приятнее пользоваться родным кодом, чем импортировать кучу функций.

Mab>С трудом представляю, как для задачи внедрения можно применить managed code. Разве что внедрить загрузчик, поднять там хост и далее загружать сборку с managed кодом. Только вот зачем все это?

Я тоже с трудом представляю. Потому и спросил.

А>>Еще можно написать managed компоненту на MC++.

Mab>Компоненту -- в смысле класс? Да можно. Подходящее по затратам решение, если API сложное и на C# через pinvoke тяжело получается.

Тяжело.

А>>А нет ли способа смешивать в одном csproj'е код шарпа и код MC++

Mab>csproj -- это c# project file. Конечно, он не может содержать код на MC++.

Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.
Re[3]: Unmanaged и managed
От: Mab Россия http://shade.msu.ru/~mab
Дата: 27.05.05 16:38
Оценка:
А>Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.
А откуда требование одного файла? Если проект достаточно большой, то в нем редко бывает всего одна сборка.

Вообще в одной сборке может быть несколько модулей (.netmodule), которые могли получаться в результате компиляции на разных языках -- и даже сделать ее средствами al можно. Но сама студия такого не поддерживает.
Re[3]: Unmanaged и managed
От: kig Россия  
Дата: 27.05.05 16:45
Оценка:
Здравствуйте, Аноним, Вы писали:

[]

А>Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.


Это подойдет?
Автор(ы): Игорь Ткачёв
Дата: 05.02.2002
До сих пор трудно ответить на вопрос, что такое .Net. Эта статья, являясь введением в Managed Extensions for C++ (MC++), содержит описание ряда смелых экспериментов советских ученых, наконец-то позволяющих понять, что же такое .Net вообще, и место MC++ в нем, в частности.
:

Смешанный код
В отличие от других CLR-языков MC++ позволяет легко смешивать управляемый и неуправляемый код....

Re[4]: Unmanaged и managed
От: Аноним  
Дата: 28.05.05 08:01
Оценка:
Здравствуйте, kig, Вы писали:

kig>Здравствуйте, Аноним, Вы писали:


kig>[]


А>>Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.


kig>Это подойдет?
Автор(ы): Игорь Ткачёв
Дата: 05.02.2002
До сих пор трудно ответить на вопрос, что такое .Net. Эта статья, являясь введением в Managed Extensions for C++ (MC++), содержит описание ряда смелых экспериментов советских ученых, наконец-то позволяющих понять, что же такое .Net вообще, и место MC++ в нем, в частности.
:


kig>

kig>Смешанный код
kig>В отличие от других CLR-языков MC++ позволяет легко смешивать управляемый и неуправляемый код....


Подойдет, если вы покажете, как добавлять туда шарп.
Re[4]: Unmanaged и managed
От: Аноним  
Дата: 28.05.05 08:04
Оценка:
Здравствуйте, Mab, Вы писали:

А>>Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.

Mab>А откуда требование одного файла? Если проект достаточно большой, то в нем редко бывает всего одна сборка.

Ну не фигачить же отдельный модуль только потому, что десяток API-функций надо вызвать. А импортировать их не хочется.

Mab>Вообще в одной сборке может быть несколько модулей (.netmodule), которые могли получаться в результате компиляции на разных языках -- и даже сделать ее средствами al можно. Но сама студия такого не поддерживает.
Re[5]: Unmanaged и managed
От: __JoKeR__ Россия  
Дата: 28.05.05 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:

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


kig>>Здравствуйте, Аноним, Вы писали:


kig>>[]


А>>>Хорошо, сформулируем по-другому. Как создать проект, компилируемый в единственный исполняемый файл, чтобы часть кода была на шарпе, а часть — на MC++ (с натив-апи-вставками)? Само собой, инфраструктура (обвязка) — managed.


kig>>Это подойдет?
Автор(ы): Игорь Ткачёв
Дата: 05.02.2002
До сих пор трудно ответить на вопрос, что такое .Net. Эта статья, являясь введением в Managed Extensions for C++ (MC++), содержит описание ряда смелых экспериментов советских ученых, наконец-то позволяющих понять, что же такое .Net вообще, и место MC++ в нем, в частности.
:


kig>>

kig>>Смешанный код
kig>>В отличие от других CLR-языков MC++ позволяет легко смешивать управляемый и неуправляемый код....


А>Подойдет, если вы покажете, как добавлять туда шарп.


А зачем собсна c#?
Модуль на managed и unmanaged c++ в managed обертке, а из c# юзать етот модуль ...
Re[5]: Unmanaged и managed
От: Mab Россия http://shade.msu.ru/~mab
Дата: 28.05.05 12:04
Оценка:
А>Ну не фигачить же отдельный модуль только потому, что десяток API-функций надо вызвать. А импортировать их не хочется.
Не модуль, а сборку. Не вижу в этом решении ничего страшного -- чем он вам помешал?
Re: Unmanaged и managed
От: LSL  
Дата: 29.05.05 16:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А нет ли способа смешивать в одном csproj'е код шарпа и код MC++, чтобы __gc-классы предоставляли интерфейс для вызовов из шарпа с unmanaged-имплементацией (WinAPI)? Может, решение очевидно, но я не дотумкал?


Для этого совсем не нужно смешивать всё в одном проекте. Три проекта в одном солюшене — три сборки (две библиотеки и приложение C#).

Unmanaged C++ Library <-- Managed C++ Wrapper <-- C# Application.

Вот, например, так сделано в 3d движке Irrlicht:
http://irrlicht.sourceforge.net/

Если этот способ подходит, то можно обратить внимание на бета версию C++/CLI там Managed C++ серьёзно переработан и выглядит гораздо приятнее. Ходят слухи о том, что в C++/CLI можно будет в одном проекте смешивать код на разных языках, но необходимости в этом не вижу...
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[2]: Unmanaged и managed
От: Аноним  
Дата: 31.05.05 05:14
Оценка:
Здравствуйте, LSL, Вы писали:

LSL>Если этот способ подходит, то можно обратить внимание на бета версию C++/CLI там Managed C++ серьёзно переработан и выглядит гораздо приятнее. Ходят слухи о том, что в C++/CLI можно будет в одном проекте смешивать код на разных языках, но необходимости в этом не вижу...


Да дело вот в чем. Все эти DllImport'ы глючат со страшной силой. Видимо, в маршалинге дело, хотя фиг его знает. Я взял пример с кодепроджекта, 1:1 его реализовал, добавил пропертигрид — и полезло: "External component throw an exception".

Следовательно, все это в анменеджд нужно. Кстати, враки все про поддержку старого кода и старых АПИ. Была бы хорошая поддержка — я бы и не заметил никаких проблем, как не замечаю их, программируя на плюсах.

Но: есть вещи, которые в анменедж не вытащить. Например, WndProc. Из анменеджд кода подписываемся на события, из менеджд их получаем.

При этом, разделять функциональность по 2-м проектам очень не хочется. Архитектура получается некрасивая. Идеальное решение — смешение в рамках одного проекта 2 языков, особенно если partial types.

Разумеется, проблема в нынешней скудности родной дотнетной функциональности и ее общей молодости. Были бы всякие WH_MOUSE_LL в System.Hooks, я б так не извращался.
Re[3]: Unmanaged и managed
От: LSL  
Дата: 31.05.05 13:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Да дело вот в чем. Все эти DllImport'ы глючат со страшной силой. Видимо, в маршалинге дело, хотя фиг его знает. Я взял пример с кодепроджекта, 1:1 его реализовал, добавил пропертигрид — и полезло: "External component throw an exception".


Я предлагаю как раз без DllImport'ов. Лучше написать библиотеку-обёртку на C++/CLI.

А>Но: есть вещи, которые в анменедж не вытащить. Например, WndProc. Из анменеджд кода подписываемся на события, из менеджд их получаем.


В смысле в managed не вытащить? Так WndProc легко вытаскивается и все прочее... В DX SDK как раз так сделано..

А>При этом, разделять функциональность по 2-м проектам очень не хочется. Архитектура получается некрасивая. Идеальное решение — смешение в рамках одного проекта 2 языков, особенно если partial types.


Мне кажется наоборот, но я реальной задачи не знаю.

Если есть большая unmanaged библиотека, которую не хотелось бы переписывать на C#, то лучше создать промежуточную библиотеку-обёртку на C++/CLI. Получится, что оборачиваемую библиотеку можно будет использовать напрямую unmanaged приложениями без обёртки и managed приложениями через обёртку. Примерно так сделан Managed DirectX.

А>Разумеется, проблема в нынешней скудности родной дотнетной функциональности и ее общей молодости. Были бы всякие WH_MOUSE_LL в System.Hooks, я б так не извращался.


... << RSDN@Home 1.1.4 beta 5 rev. 395>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.