Интеграция Mapinfo и.NET C#
Я разрабатываю приложение в MapBasic, которое вызывает методы в библиотеке сборки.NET
Вот как я объявляю метод в моей среде MapBasice.
Declare Method showMainWindow Class "mynamespace.AldebaranInterface" Lib "Aldebaran.dll" ()
Sub ShowWindow
Call showMainWindow()
End Sub
Sub formEventHandler
'Reacting to some button click. I need to call this Sub from somewhere in mynamespace.AldebaranInterface
End Sub
Мне нужно отозвать некоторые Sub или Funcion в моем приложении MapBasic из моего кода.NET C#. Скажем, выполним некоторую часть кода MapBasic, когда пользователь нажимает какую-то кнопку в моей форме.NET.
Есть способ сделать это? Если так. Как мне этого добиться? Любая помощь будет высоко оценен.
1 ответ
Я не уверен, что должен делать ваш.dll, я думаю, это форма, так как вам нужен ваш основной код, чтобы реагировать на нажатие кнопки.
Чтобы отправить команду в mapbasic, вам нужно создать экземпляр COM-объекта Mapinfo. Вот ссылка на то, как это сделать. Я лично использую второй подход.
Итак, после создания класса:
public class Mapinfo
{
private object mapinfoinstance;
public Mapinfo(object mapinfo)
{
this. mapinfoinstance = mapinfo;
}
public static Mapinfo CreateInstance()
{
Type mapinfotype = Type.GetTypeFromProgID("Mapinfo.Application");
object instance = Activator.CreateInstance(mapinfotype);
return new Mapinfo(instance);
}
public void Do(string command)
{
parameter[0] = command;
mapinfoType.InvokeMember("Do",
BindingFlags.InvokeMethod,
null, instance, parameter);
}
public string Eval(string command)
{
parameter[0] = command;
return (string)mapinfoType.InvokeMember("Eval", BindingFlags.InvokeMethod,
null,instance,parameter);
}
}
, вам нужно добавить событие нажатия кнопки:
appMapInfo = Mapinfo.CreateInstance();
//It's good idea to pass this path string from your MapBasic code
//as method parameter in your .dll
string appMapInfoFilePath = @"D:\YourMBXPath\YourMBX.MBX";
//argumet you want to pass to MapBasic code
string argForMapBasic = ...;
string runCommand;
string subCommand;
subCommand = "dim i_chan_num as integer i_chan_num = DDEInitiate(\"\"MapInfo\"\",\"\"" + appMapInfoFilePath + "\"\")";
subCommand = subCommand + " DDEExecute i_chan_num, \"\"" + argForMapBasic + "\"\" DDETerminate i_chan_num";
runCommand = String.Format("Run Command \"{0}\"", subCommand);
appMapInfo.Do(runCommand);
Теперь на стороне MapBasic вы должны создать Sub RemoteMsgHandler (Ссылка на MapBasic: зарезервированное имя процедуры, вызываемое, когда удаленное приложение отправляет сообщение выполнения.)
Sub RemoteMsgHandler
Dim command as String
'command - string passed from your C# code (string argForMapBasic)
command = CommandInfo(CMD_INFO_MSG)
'pass a command to your procedure
Call yourProcedure(command)
End Sub