Страница: 1 | 2 |
Вопрос: Отцы и дети? .NET? Бо?
Добавлено: 18.04.10 22:27
Автор вопроса: VβÐUηìt | Web-сайт:
Тут конфликт поколений походу: COM и .NET
Из я не знаю какого места я нарыл библиотечку, которая очень удобно позволяет подрубаться к VBScript и JavaScript на C#. Так же удобно, как когда-то было на VB6.
VBScript ScriptControl1 = new VBScript();
ScriptControl1.AddObject (..., ...);
ScriptControl1.AddScript (...);
Вобщем удобно. В VB6 этот раста (как я понял, тот был совсем другой, и это принципиально другая вещ, только выглядящая внешне как та), спокойно жрал объекты методом AddObject:
ScriptControl1.AddObject "Application", Me
А на C# меня посылают в глубокую задницу, и даже не могут вызвать гребаную процедурку. Хотя объект добавляется:
ScriptControl1.AddObject("Application", this);
в инете говорят что-то типа "чтобы не было проблем, наследуем добавляемый обджект от IDispatch", но я так с этим и не разобрался. По-нормальному проблема называется так: как засунуть в VBScript .NET-овский объект?
Заранее благодарен.
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 18.04.10 23:15
Еще поковырялся и более сильно вник: если у меня есть скрипт, я добавляю туда свой .NET-овский объект, а затем пытаюсь вызывать из скрипта функцию этого .NET объекта, вываливается Exception. Вот. Функция у этого объекта принмает единственный аргумент типа object, тобишь проблем с приведением типов быть не должно. Какие соображения?
Номер ответа: 2
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #2
Добавлено: 18.04.10 23:22
Может его нужно сделать COM-видимым? Я где-то находил, там раста в квадратных скобках что-то над классом писал...
Номер ответа: 3
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 19.04.10 00:02
Предположительно, что у объекта в среде VBScript функции называются не так, как они называются в C# - ибо если я обращаюсь вообще к несуществующей функции, результат тот же самый - "Адресат вызвал исключение".
?
Номер ответа: 4
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #4
Добавлено: 19.04.10 06:32
Все разобрался. Кому интересно: оно не понимало преобразование типа, то есть вместо
Пишем
public void MyProcedure(object b)
{
double a = Convert.ToDouble(b);
}
[/source]
От так.
Номер ответа: 5
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #5
Добавлено: 19.04.10 08:20
VβÐUηìt разговаривает сам с собой...
Номер ответа: 6
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #6
Добавлено: 19.04.10 08:49
Так с этой батвой с ума сойдешь. Да и тут фиг ответа дождешься
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 19.04.10 10:13
Что то мне подсказывает, что ты изобретаешь очередной велосипед для вычисления строковых выражений в своем мегакалькуляторе.. Если это так, то есть более цивилизованные способы..
Например, можно сделать так:
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 19.04.10 10:28
И это без всяких COM-объектов и геморроя..
Кроме всего прочего существуют достаточно тривиальные алгоритмя синтаксического разбора вычисляемого выражения.
Можешь например глянуть тут: http://algolist.manual.ru/syntax/parsear.php
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 19.04.10 19:15
Можно написать скрипт на C#, затем через C# CodeDOM скомпилировать, динамически загрузить сборку в домен и работать с ней. Скорость работы будет сравнима со скоростью работы скомпилированного кода (только вызовы будут виртуальными, но это разницы почти не даст).
Номер ответа: 10
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #10
Добавлено: 21.04.10 10:39
Смотрел, понравилось. Но:
В пользу VBScript
1) Его нужно компилировать. По-моему, компиляция C# кода + запуск C# кода медленнее, чем интерпретация VBScirpt
2) Простота. C# явно посложнее будет
В пользу C#:
1) Конечно же, фраемворк в полном функционале
2) Скорость работы, которая оговаривалась раньше
Из этого я делаю вывод, что нужно делать поддержку и того, и другого - правильно?
Номер ответа: 11
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #11
Добавлено: 22.04.10 07:35
Его нужно компилировать
В смысле не нужно. Ну вы поняли)
Простота. C# явно посложнее будет
Простота имеется в виду для раста, которые решат что-то поменять
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 22.04.10 08:40
это тебе решать, но я бы отказался от COM... Кроме того CodeDOM позволит юзать не только C# в качестве скрипта но и тот же самый VB.NET(разница лишь в декларации CodeProvider) плюс ты забыл учесть полноценную обработку ошибок, что ,имхо, тоже очень не маловажно.
Вывод: Если нет острой необходимости в использование COM (VBS в твоем случае), то пусть он покоится с миром..
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 24.04.10 17:44
1) Его нужно компилировать. По-моему, компиляция C# кода + запуск C# кода медленнее, чем интерпретация VBScirpt
В моем проекте генерация генерация и загрукза нескольких классов, всего 1.7К строк кода, больше 150 методов, занимает 300 мс. Разумеется, это намного дольше чем запуск кода vbscript, который не требует какой-либо подготовки перед запуском.
С другой стороны, скорость работы откомпилированного кода будет намного выше скорости работы интерпретируемого кода, ты не можешь этого не понимать, поэтому если этот код будет активно использоваться, то разница между сгенерированой сборкой и vbscript будет очень заметная (если, конечно, все верно сделаешь), и эти 300 мс уже будут неощутимыми.
Номер ответа: 14
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #14
Добавлено: 02.05.10 22:28
Логично. Но тут такая фегня - код может меняться порядка десяти раз в секунду (!). И изменения там не в одной строчке, так что вынести параметрами функций не получится. Тут волей не волей, а 300 мс - это многовато будет. С другой стороны, студия же, если я останавливаю свой проект, меняю там парочку строчек, и снова его запускаю, не перебилдивает весь проект с нуля? Она только вносит изменения, что длится ощутимо быстрее, чем Rebuild All.
PS: Я где-то слышал очень хорошее мнение об использовании Python-скриптов в .NET. Как там, интересно, с этим? Если это дело там о-очень хорошо интегрировано (так же, как LINQ), типа отладка скрипта внутри той же студии по шагам, то питон-золото, и его как раз и нужно использовать.
Номер ответа: 15
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #15
Добавлено: 02.05.10 23:42
И изменения там не в одной строчке, так что вынести параметрами функций не получится. Тут волей не волей, а 300 мс - это многовато будет.
300 мс - это первая сборка файла с 1.7К строк. В это время может входить время, которое тратится на первую загрузку и подготовку сборок CodeDOM и еще что-то.
Вполне возможно, последующие сборки будут выполняться быстрее чем первая.
Также воплне возможно, что небольшой скрипт на несколько десятков строк будет собираться ощутимо быстрее.
Для того чтоб было возможно редактирование кода, JIT-компилятор в конце функции оставляет пустое место.
Когда в отладчике выполнется редактирование кода, выполняется компиляция метода, старая функция заменяется новой, обновляется содержимое стека, и указатель выполнения, после чего выполнение может продолжаться дальше.
Без наличия специального окружения, которое есть в VS .NET, в своем проекте повторить такое же будет невозможно.
Официальной поддержки IronPyton в VS .NET нет, но можно с codeplex скачать дополнение к VS .NET и юзать.
Отладчик там вроде бы есть.