26/07/2016
Загрузка и выполнение VBA-макроса из .NET приложения
Код ниже показывает процедуру загрузки и выполнения VBA-макроса из .NET сборки. Здесь используются методы LoadDVB и RunMacro из AutoCAD ActiveX API. Так как код использует ключевое слово dynamic (или Reflection), то отпадает необходимость подключать ссылки к AutoCAD ActiveX (interop) модулям.
Код - C#: [Выделить]
- using System;
- using System.Reflection;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- // This line is not mandatory, but improves loading performances
- [assembly: CommandClass(typeof(RunVBA.MyCommands))]
- namespace RunVBA
- {
- public class MyCommands
- {
- [CommandMethod("LoadRunVBA")]
- public static void MyCmd()
- {
- dynamic acadApplication = Application.AcadApplication;
- acadApplication.LoadDVB(@"C:\cases\area.dvb");
- acadApplication.RunMacro("mytest");
- }
- [CommandMethod("LoadRunVBA_reflection")]
- public static void LoadDVBFile_ref()
- {
- LoadDVBFile(@"C:\cases\area.dvb");
- RunMacro("mytest");
- }
- public static void LoadDVBFile(string path)
- {
- object acadApplication = Application.AcadApplication;
- acadApplication.GetType().InvokeMember("LoadDVB", BindingFlags.InvokeMethod, null,
- acadApplication, new object[] { path });
- }
- public static void RunMacro(string macro)
- {
- object acadApplication = Application.AcadApplication;
- acadApplication.GetType().InvokeMember("RunMacro", BindingFlags.InvokeMethod, null,
- acadApplication, new object[] { macro });
- }
- }
- }
По мотивам: http://adndevblog.typepad.com/autocad/2016/07/load-and-run-vba-macro-through-net-command.html
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7238
Опубликовано 26.07.2016