Апр 032009
 

Неоднократно я слышал фразы  типа: “Вот было б хорошо писать скрипты в TDMS не на VBS, а C#… ” и самому хотелось того же. Но такой возможности не реализовано. По этой причине долгое время приходилось использовать средства предоставленные разработчиками CSoft. Но настал тот момент, когда для реализации требуются гораздо более широкий функционал, чем может предоставить виртуальная машина VBS. Для этого был написан модуль, позволяющий реализовать скрипты на C#.

Использование данного модуля позволяет написать сам скрипт в системе TDMS на C# или использовать уже откомпилированную .Net библиотеку.

Требуется.

* TDMS
* .Net Framework 2.0 или выше
* Руки

Установка.

Просто распаковать содержимое архива в корень папки с TDMS.

Использование.

Как написано выше, есть 2 способа использования:

1. Писать сам скрипт на C#
2. Подключить откомпилированную библиотеку .Net

Способ 1.

Создаем команду (в моем случае это CMD_CSHARPSOURCE) и вставляем или пишем код на C#. Для того чтоб обозначить, что это код на C# требуется вставить в виде комментария в любом месте кода “//[sharp]” и все.

CMD_CSHARPSOURCE

В качестве параметра функция принимает массив  объектов в котором элементы:

[0] – TDMSApplication

[1] – TDMSObject для которого выполняется скрипт

[2] – TDMSCommand.

Это обязательная функция, именно она и будет выполняться (класс и пространство имен аналогично).


//1
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using TDMS;

namespace MyNamespace
{
public class MyClass
{
public object DynamicCode(params object[] Parameters)
{
object result = new object();
//TDMSApplication tdmsApp = (TDMSApplication)Parameters[0];
TDMSObject tdmsObj = (TDMSObject)Parameters[1];
MessageBox.Show(tdmsObj.Description);
//TDMSCommand tdmsCommand = (TDMSCommand)Parameters[2];
return result;
}
}

}

Скрипт компилируется только если он был изменен. Если не менялся то используется ранее откомпилированная версия – для оптимизации и ускорения работы. Все библиотеки, откомпилированных скриптов находятся в “…\Мои документы\ CSharpModules”.

Способ 2.

Создаем команду (в моем случае это CMD_CSHARPPREBUILD) и пишем и в теле скрипта следующее:

* [precompiled] — объявление что используем готовую библиотеку
* nameAssembly — физическое место хранения библиотеки, если это сетевой ресурс то не стоит забывать, что политика безопасности .Net Framework Windows не позволит использовать ее без внесения в список разрешенных ресурсов. Для этого следует воспользоваться графическим интерфейсом (установить .Net Framework SDK) или приложением caspol.exe.
* nameSpace — пространство имен используемого класса (namespace)
* nameClass — имя используемого класса.
* nameFunction — функция которую будем использовать

Пример:

CMD_CSHARPSOURCE


[precompiled]
nameAssembly = "C:\\Temp\\testCSharp2.dll"
nameSpace = testCSharp2
nameClass = Class1
nameFunction = DynamicCode

Конструктор класса должен быть по умолчанию (не принимать параметров) , а функция принимать массив объектов как в первом способе (из исходного кода).


public object DynamicCode(params object[] Parameters)

{

return new object();

}

Код из dll:


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using TDMS;

namespace testCSharp2
{
public class Class1
{
public object DynamicCode(params object[] Parameters)
{
object result = new object();

TDMSApplication tdmsApp = (TDMSApplication)Parameters[0];
TDMSObject tdmsObj = (TDMSObject)Parameters[1];
TDMSCommand tdmsCommand = (TDMSCommand)Parameters[2];

MessageBox.Show(tdmsObj.Description);
return result;
}
}
}

Свои собранные библиотеки не следует помещать в папку “…\Мои документы\ CSharpModules”, так как при запуске TDMS проверяется контрольная сумма скриптов, а так как скриптов для этих библиотек нет, то они будут удалены.

Вот и все, подключаем команды к объектам и используем.

Пишите ))

Ссылка на архив с модулем для версии 3.0.170
Исходники

P.S.

Сейчас делаю графический редактор для C# с подсветкой синтаксиса, code completion, проверкой скриптов и выводом отладочной информации.

Дополнительно.
Для того чтоб все это работало у простых пользователей пришлось завести команду CMD_GET_SCRIPT_FROM_COMMAND, так как они не имеют доступа непосредственно к самому скрипту. Команда должна выполняться без проверки прав и иметь одну процедуру:

Sub Command_BeforeExecute(Command, Obj, Cancel)
ThisScript.SysAdminModeOn
Dim dict
Dim cmd
Set dict = ThisApplication.Dictionary("srcDict")
Set cmd = ThisApplication.Commands(dict("com"))
dict.Item(dict("com")) = cmd.Script
ThisScript.SysAdminModeOff
End Sub

Для добавления референсов на сборки требуется написать подобным образом:

//@c:\dasdas\123.dll
//@C:\WINDOWS\assembly\GAC_MSIL\Autodesk.AutoCAD.Interop\17.1.51.0__eed84259d7cbf30b\Autodesk.AutoCAD.Interop.dll

 Posted by at 12:43

  22 Responses to “Использование C# для написания скриптов в TDMS.”

  1. Автор молодец))))хих

  2. да прикольно, мне очень понравилось

  3. Хороший пост!

  4. Подписываюсь под каждым словом

  5. Предлагаю Вам зайти на сайт, на котором есть много информации по этому вопросу.

  6. Охотно принимаю. На мой взгляд, это актуально, буду принимать участие в обсуждении. Я знаю, что вместе мы сможем прийти к правильному ответу.

  7. Контент интересный,почерпнул много новго.
    всем рекомендую для прочтения.

  8. Хороший блог! Интересные новости! Спасибо, подпишусь!

  9. Хм, действительно интересно! Спасибо автор, жду новых статей, спасибо!

  10. the-void, что то не работает… На первой же строке выдает ошибку, что то вроде неверная команда (не с работы пишу точную формулировку не помню). Может что то при установке или в настройках надо подключить?

  11. Совершенно верно! Я думаю, что это отличная идея.

  12. Заработало! но теперь проблема как делать ссылки на сборки. Например
    using System.Drawing прописали, но при выполнении выдает
    Тип «System.Drawing.Point» определен в сборке, ссылка на которую отсутствует…

  13. дело в том, что в данной версии жестко были прописаны референсы и «System.Drawing» в них не попал, позже выложу новую версию где можно указывать сборки на которые ссылается ваш код. Кстати если использовать уже готовую длл то этой проблемы не будет.

  14. Выложил новую версию с возможность добавлять свои референсы + есть дополнение по требованиям.

  15. Спасибо! Завтра попробую. Не могу определиться как лучше сделать, скриптом или dll кой или вообще activeX написать. Нужно вывести форму с деревом объектов для выбора пользователем нескольких объектов, на данный момент я все написал в виде отдельного приложения которое получает доступ к TDMS через Marshal, но нужно чтобы запускалось конечно из самого TDMS…

  16. У администратора TDMS все запускается, а вот у пользователей на той же машине ругается на несоответствие типа ‘precompiled’. Это когда откомпилированную dll ку пытаюсь запускать.
    Или я не правильно понял пункт «Дополнительно» или он подходит только для версии 170 (у меня пока что 167).
    Когда пытаюсь использовать библиотеку для 170 версии в 167 TDMS сразу падает.

    P.S. А как можно связаться с Вами? e-mail или icq, тут никаких контактов не нашел…

  17. могу выложить исходники, но предупреждаю написаны они на «коленках», поэтому не стоит ругаться по поводу оптимизации и правильности написания кода, потому как мне просто хотелось скрестить 2-х зверьков этих. Проверил, работает и все ну и норм). Аська 258885770.

  18. Хороший блог, буду ждать ещё статей! С ув. Саша

  19. суперконтент опупительный. так держать

  20. Спасибо огромное за шикарную информацию, я об этом и не догадывался

  21. Занятная тема,благодарю буду чаще читать

  22. Нормально, можно cделать маленький сборник.

 Leave a Reply

(required)

(required)


восемь + = 9

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>