Взаимодействие Zinc и .NET
Запись от alexcon314 размещена 19.04.2011 в 08:18
Есть замечательный mdm-класс mdm.DLL(). Он позволяет подключать к вашему приложению любые длл и работать с их экспортными функциями. Тем самым предоставляется возможность неограниченно расширять функционал вашего приложения. Однако в доках указывается одно существенное ограничение: этот класс может подключить только длл написанные на С++ в среде MS VisualStudio C++ или на Delphi. А как же .NET? Этот фреймворк заслуженно пользуется популярностью среди разработчиков и содержит массу полезностей. Писать на .NET зачастую проще и быстрее. Короче, как бы это исправить, то бишь научить цинк работать с нетовскими сборками?
Против доков не попрешь, нет-длл к цинку не подключить напрямую, это правда.
Но кто мешает написать с++-длл, выполняющую роль обертки, транслирующей вызовы из нативного кода в ненативный, т.е. в код, написанный на .NET?
Покопавшись в запасниках сорцов Интернета, я нашел доволно много примеров написания такого рода оберток. Вот один из них, наиболее простой для понимания и реализации (есть и посложнее) : http://www.codeproject.com/KB/dotnet/bridge.aspx
Изучив эту статейку, и ничтоже сумняшеся, я решил прикрутить все это дело к цинку.
Что нужно для работы:
- MS VC++ 2008 Express Edition для написания обертки,
- MS VC# 2008 Express Edition для написания нетовской сборки,
- Flash IDE (8)
- Zinc (2.5.0.34).
Начнем.
В VC# создаем проект типа ClassLibrary, даем ему какое-нибудь название типа cslib. Открываем класс, созданный средой по-умолчанию, переименовываем его, скажем в MyDotNetClass, namespace тоже можно указать что-то навроде CSLib.
Код:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace CSLib { public class MyDotNetClass { public void MsgBox(String df) { MessageBox.Show(df,".NET"); } } }
В VC++ создаем пустой win32-проект типа dll. В свойствах проекта на вкладке "Свойства конфигурации->Общие" в пункте "Поддержка среды CLR" указываем "CLR-поддержка, старый синтаксис". Добавляем в проект срр-файл следующего содержания:
Код:
// bridgeNet.cpp: определяет экспортированные функции для приложения DLL. // #using "mscorlib.dll" //далее в #using указываем путь к нетовской сборке, которую хотим врапить #using "..\..\app\cslib.dll" // ну и namespace из сборки укажем using namespace CSLib; extern "C" { __declspec(dllexport) bool __cdecl net_MsgBox(char* df) { MyDotNetClass __gc *dotNetClass; dotNetClass = new MyDotNetClass; dotNetClass->MsgBox(df); return true; } }
Во Flash IDE создаем новый .fla,скажем, zincNet.fla, кладем на сцену кнопку btn и текстовое поле txt типа input. Пишем в первом кадре
Код:
btn.onRelease = function() { var myDLL = new mdm.DLL("bridgeNet.dll"); var frequency = myDLL.addParameter("string", txt.text); var res:Boolean = myDLL.call("boolean", "net_MsgBox"); };
В Zinc IDE компилим из этого свф-а zincNet.exe.
Последнее, собираем все файлики cslib.dll, bridgeNet.dll, zincNet.exe в одну папочку. Запускаем ехе и набив какую-нибуть строчку в инпуте жмем кнопку. Появляется мессаджбокс с вашей строчкой. Все. Вот мы и вызвали метод класса из .NET-сборки.
Пример минимизирован до-нельзя. Как обычно, копать, думать и опять копать дальше вам придется самостоятельно)).
Во вложении архив проектов c++, c# и .fla, а так же получившиеся у меня длл-ки.
[из реорганизованного раздела Flash Приложения: AIR, Zinc и тд.]
Всего комментариев 3
Комментарии
![]() ![]() |
|
Цитата:
Если нужно, чтобы Flash работал с .NET, то лучше использовать контейнер ActiveX.
|
![]() ![]() |
|
alexcon314, конечно, я имел ввиду разработку "с нуля". Когда нужно свести до кучи уже готовые сборки, то все методы хороши.
|
Последние записи от alexcon314
- Пишем свою оболочку для FP под Windows. Шаг 6. (19.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 5. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 4. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 3. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 2. (17.05.2011)