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