Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=95)
-   -   Взаимодействие Zinc и .NET (http://www.flasher.ru/forum/showthread.php?t=130074)

alexcon314 17.09.2009 10:16

Взаимодействие Zinc и .NET
 
Вложений: 1
Есть замечательный 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, а так же получившиеся у меня длл-ки.


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

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