Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
Все разобрался. Кому интересно: оно не понимало преобразование типа, то есть вместо
  1.  
  2. public void MyProcedure(object b)
  3. {
  4. double a = (double)b;
  5. }


Пишем
public void MyProcedure(object b)
{
double a = Convert.ToDouble(b);
}

[/source]
От так.

Ответить

Номер ответа: 5
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #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
Что то мне подсказывает, что ты изобретаешь очередной велосипед для вычисления строковых выражений в своем мегакалькуляторе.. Если это так, то есть более цивилизованные способы..
Например, можно сделать так:

  1.  
  2. using System;
  3. using Microsoft.JScript;
  4. using Microsoft.JScript.Vsa;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.     class Program
  9.     {
  10.         static VsaEngine m_vsaEngine = new VsaEngine();
  11.  
  12.         static void Main(string[] args)
  13.         {
  14.             object result = Calculate("(5+2)*3");
  15.             Console.WriteLine(result);
  16.  
  17.             /* wait */
  18.             Console.ReadLine();
  19.         }
  20.  
  21.         static object Calculate(string expression)
  22.         {
  23.             return Eval.JScriptEvaluate(expression, m_vsaEngine);
  24.         }
  25.     }
  26. }

Ответить

Номер ответа: 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
VβÐUηìt пишет:
Его нужно компилировать

В смысле не нужно. Ну вы поняли)
VβÐUηìt пишет:
Простота. 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
VβÐUηìt пишет:
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
VBD пишет:
И изменения там не в одной строчке, так что вынести параметрами функций не получится. Тут волей не волей, а 300 мс - это многовато будет.

300 мс - это первая сборка файла с 1.7К строк. В это время может входить время, которое тратится на первую загрузку и подготовку сборок CodeDOM и еще что-то.
Вполне возможно, последующие сборки будут выполняться быстрее чем первая.
Также воплне возможно, что небольшой скрипт на несколько десятков строк будет собираться ощутимо быстрее.

С другой стороны, студия же, если я останавливаю свой проект, меняю там парочку строчек, и снова его запускаю, не перебилдивает весь проект с нуля? Она только вносит изменения, что длится ощутимо быстрее, чем Rebuild All.

Для того чтоб было возможно редактирование кода, JIT-компилятор в конце функции оставляет пустое место.
Когда в отладчике выполнется редактирование кода, выполняется компиляция метода, старая функция заменяется новой, обновляется содержимое стека, и указатель выполнения, после чего выполнение может продолжаться дальше.
Без наличия специального окружения, которое есть в VS .NET, в своем проекте повторить такое же будет невозможно.

Официальной поддержки IronPyton в VS .NET нет, но можно с codeplex скачать дополнение к VS .NET и юзать.
Отладчик там вроде бы есть.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам