Автор оригинальной статьи:
Augusto Goncalves. Статья находится тут:
http://adndevblog.typepad.com/infrastructure/2015/03/is-a-civil-3d-instance.htmlЭто .NET версия кода, размещенная моим коллегой (
оригинал тут), переработанная под Civil 3D наименования.
Когда мы получаем экземпляр запущенного (приложения) AutoCAD, мы не знаем, что это за вертикальный продукт, так как все они базируются на одной платформе. Чтобы определить, с чем мы имеем дело, мы должны как-то это проверить. И это как раз то, что делает этот код:
' получение запущенного экземпляра AutoCAD (или вертикального решения)
Dim acadApp As Object = GetObject(, "Autocad.Application")
' это Civil 3D? Попробуем!
Dim civilLandApp As Object
Try
' 10.4 обозначает 2015 версию
civilLandApp = acadApp.GetInterfaceObject
("AeccXUiLand.AeccApplication.10.4")
Catch ex As Exception
Return ' не Civil 3D
End Try
' теперь мы знаем – это Civil 3D
' что-то делаем
И в C# будет в основном то же самое, за исключением того, что необходимо определиться: когда использовать var, а когда dynamic. Приведенный выше код использует Object который позволяет позднее связывание. Если это ваш вариант, тогда используйте C#-эквивалент:
dynamic.
От переводчика, версия для C#:
dynamic acadApp;
try
{
// получение запущенного экземпляра AutoCAD (или вертикального решения)
acadApp = Marshal.GetActiveObject("AutoCAD.Application");
}
catch
{
// нет запущенного AutoCAD
return;
}
// это Civil 3D? Попробуем!
dynamic civilLandApp;
try
{
// 10.3 - для версии 2014,
// 10.4 - 2015,
// 10.5 - 2016
civilLandApp = acadApp.GetInterfaceObject
("AeccXUiLand.AeccApplication.10.3");
}
catch
{
// не Civil 3D
return;
}
// теперь мы знаем – это Civil 3D
// что-то делаем, например, выведем сообщение:
System.Windows.Forms.MessageBox.Show("Это Civil 3D 2014!");