Значит
0) Путем упорного гугления собрал воедино советы уважаемого
Александра Ривилиса, касательно данного вопроса, разбросанные в веках.
1) Загрузил и распаковал
ObjectARX2018.
2) Подключил из него к проекту три библиотеки (AcCoreMgd.dll, AcDbMgd.dll, AcMgd.dll).
3) С помощью утилиты
dumpbin (dumpbin.exe /exports accore.dll >accore.txt), поставляемой вместе с вижуал студией, обнаружил в этих библиотеках точку входа в функцию
acedEvaluateLisp (?acedEvaluateLisp@@YAHPEB_WAEAPEAUresbuf@@@Z)
4) Используя технологию
P/Invoke, подключил к своей библиотеке функцию acedEvaluateLisp.
5) Используя
AcadEvalLisp попытался выполнить в контексте автокада
ace_getactiveproject, но на этом застопорился.
Не могу обработать возвращаемый результат -
(5014,-1). То ли 5014 это код ошибки, то ли нет, но в любом случае -1 это не имя текущего проекта.
Если передать в AcadEvalLisp строковый параметр "(+ 100 50 30 20 10)", то результат
(5003,210), где 210 и есть сумма всех слагаемых. При этом 5003 это не 5014.
Прошу подсказать что можно предпринять.
public class DrawDraw
{
[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("accore.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?acedEvaluateLisp@@YAHPEB_WAEAPEAUresbuf@@@Z")] // dumpbin.exe /exports accore.dll >accore.txt
extern private static int acedEvaluateLisp(string lispLine, out IntPtr result);
static public ResultBuffer AcadEvalLisp(string arg)
{
IntPtr rb = IntPtr.Zero;
acedEvaluateLisp(arg, out rb);
if (rb != IntPtr.Zero)
{
try
{
ResultBuffer rbb = DisposableWrapper.Create(typeof(ResultBuffer), rb, true) as ResultBuffer;
return rbb;
}
catch
{
return null;
}
}
return null;
}
[CommandMethod("qqqtest")]
static public void test()
{
ResultBuffer rb = AcadEvalLisp("ace_getactiveproject"); // Без проверки на существование функции
if (rb != null)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(rb.ToString()); // Результат выполнения: (5014,-1)
}
else
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nError in evaluation");
}
}
}