Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > alexcon314

Оценить эту запись

Взаимодействие 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");
        }
    }
}
Компилим, получаем файл cslib.dll.

В 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;
	}
}
Компилим, получаем файл bridgeNet.dll (название может быть вашим).
Во 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");
};
Компилим, получаем zincNet.swf.
В Zinc IDE компилим из этого свф-а zincNet.exe.
Последнее, собираем все файлики cslib.dll, bridgeNet.dll, zincNet.exe в одну папочку. Запускаем ехе и набив какую-нибуть строчку в инпуте жмем кнопку. Появляется мессаджбокс с вашей строчкой. Все. Вот мы и вызвали метод класса из .NET-сборки.
Пример минимизирован до-нельзя. Как обычно, копать, думать и опять копать дальше вам придется самостоятельно)).
Во вложении архив проектов c++, c# и .fla, а так же получившиеся у меня длл-ки.

[из реорганизованного раздела Flash Приложения: AIR, Zinc и тд.]
Вложения
Тип файла: zip ZINK+NET.zip (70.9 Кб, 102 просмотров)
Всего комментариев 3

Комментарии

Старый 21.04.2011 17:31 zorexundra вне форума
zorexundra
Если нужно, чтобы Flash работал с .NET, то лучше использовать контейнер ActiveX.
Оболочка Zinc в данном случае - лишний посредник. Это как отправить старую консьержку в магазин за водкой. И вернётся поздно, и пренесёт не то, и из бутылки отхлебнёт.
Старый 21.04.2011 17:49 alexcon314 вне форума
alexcon314
Цитата:
Если нужно, чтобы Flash работал с .NET, то лучше использовать контейнер ActiveX.
zorexundra, это уже совсем другая история..
Старый 21.04.2011 17:54 zorexundra вне форума
zorexundra
alexcon314, конечно, я имел ввиду разработку "с нуля". Когда нужно свести до кучи уже готовые сборки, то все методы хороши.
 

 


Часовой пояс GMT +4, время: 07:39.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.