|
|
|||||
listener
|
Взаимодействие Zinc и .NET
Есть замечательный 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, а так же получившиеся у меня длл-ки. Последний раз редактировалось alexcon314; 17.09.2009 в 14:36. |
Часовой пояс GMT +4, время: 12:50. |
|
« Предыдущая тема | Следующая тема » |
|
|