Волшебный форум

Вход | Регистрация


Информационные технологии ::

Метки:


.Net: COM: Объект для компиляции модулей .NET в процессе выполнения "На лету"  Я
   Gepard
 
12.02.08 - 10:08
COM Объект, который позволяет компилировать и получать объекты .NET прямо из модулей 1С





http://www.d01-soft.ru/downloads/com/loader.rar
3
9
22
24
67
68
70
   Gepard
 
1 - 12.02.08 - 10:12
Т.е. сейчас прямо в модуле отчета 1С можно написать такое:


Процедура Сформировать()
   
   Загрузчик = СоздатьОбъект("Gepard.Загрузчик");
   
   Загрузчик.УстановитьКоличествоДополнительныхСборок(2);
   Загрузчик.УстановитьдополнительнуюСборку(0, "System.dll");
   Загрузчик.УстановитьдополнительнуюСборку(1, "System.Windows.Forms.dll");
   
   СтрокаДляКомпиляции = "
   |
   |using System.Windows.Forms;
   |
   |namespace ClassLibrary1
   |{
   |    public class Class1
   |    {
   |        public void ShowMessage(string Message)
   |        {
   |            MessageBox.Show(Message);
   |        }
   |    }
   |}
   |
   |";
   
   Если Загрузчик.КомпилироватьСборку(СтрокаДляКомпиляции) = 1 Тогда
       
       Новыйобъект = Загрузчик.ПолучитьОбъект("ClassLibrary1.Class1");    
       
       Новыйобъект.ShowMessage("Тестовое сообщение");
       
   Иначе
       
       Сообщить("Ошибка компиляции!");
       
   КонецЕсли;

КонецПроцедуры
   The gray Cardinal
 
2 - 12.02.08 - 10:25
Синонимы:
Gepard.Загрузчик = Gepard.Loader
УстановитьКоличествоДополнительныхСборок = SetAdditionalAssemblysCount
УстановитьДополнительнуюСборку = SetAdditionalAssembly
КомпилироватьСборку = Build
ПолучитьОбъект = GetObject

Пожелания:
1. Возможно, в методе УстановитьдополнительнуюСборку не нужен первый параметр.
2. В методе КомпилироватьСборку хотелось бы иметь возможность указать путь к текстовому файлу и автоматически грузануть исходник из него.
3. Нужна поддержка VB.NET, обязательно :)
1
12
   sapphire
 
3 - 12.02.08 - 10:27
(0) прикольно, автору решпект :)
   The gray Cardinal
 
4 - 12.02.08 - 10:29
+ Хотелось бы иметь возможность запускать код из исходника просто двойным щелчком из Проводника :)))
Скажем, зарегить расширения ".vb.net" и ".c.net".
20
   Salvador Limones
 
5 - 12.02.08 - 10:29
Есть ограничения на сборки? Т.е. можно ли подключить, например, Microsoft.DirectX.Direct3D.dll?6
   Gepard
 
6 - 12.02.08 - 10:35
(5) честно... не знаю :)) наверное можно...
   The gray Cardinal
 
7 - 12.02.08 - 10:38
И кстати, наверное, кроме метода "GetObject", нужен метод "Run".8
   The gray Cardinal
 
8 - 12.02.08 - 10:42
+(7) Для запуска не сборок-библиотек, а как бы уже готовой "независимой" исполняемой программы.
   Jolly Roger
 
9 - 12.02.08 - 10:50
(0) А где это может пригодиться?10
11
   sapphire
 
10 - 12.02.08 - 10:52
(9) Получение всякого рода специфики, недоступной из 1С.
Например, более простое управление wmi.
13
15
   The gray Cardinal
 
11 - 12.02.08 - 10:54
(9) Для 1С - это что-то вроде создания своих внешних микро-компонент на .NET "на лету" со всеми вытекающими. Для скриптовых языков типа VBScript - это возможность существенно расширить функционал мощами .NET.15
   Gepard
 
12 - 12.02.08 - 10:56
(2) можно качать нову версию с учетом исправлений

1. Английские синонимы
2. Не надо ставить номер доп. сборки
3. Возможность компиляции кода на VB (методы КомпилироватьСборкуVB, BuildVB)


Синонимы:
Gepard.Загрузчик = Gepard.Loader
УстановитьКоличествоДополнительныхСборок = SetAdditionalAssemblysCount
УстановитьДополнительнуюСборку = SetAdditionalAssembly
КомпилироватьСборку = Build
ПолучитьОбъект = GetObject
   The gray Cardinal
 
13 - 12.02.08 - 10:59
(10) Имхо как раз "управление wmi" сильно не станет "более простым" :)))
Вобщем-то, какая разница - оборачивать WMI в v7.7 этой штукой или MSScriptControl.ScriptControl. А в восьмёрке с WMI по-моему вообще особых проблем нет. А интересными могут быть куча других вещей - например, юзанье Win32API, да и вообще любых экспортируемых функций любых DLL.
   Gepard
 
14 - 12.02.08 - 11:02
Да те же VK для которых требовались админские права...

а если надо обновить ВК... а так конфигурацию обновил и все...
   Jolly Roger
 
15 - 12.02.08 - 11:13
(10)(11) А не проще сразу сборку на шарпе скомпилить?16
   Gepard
 
16 - 12.02.08 - 11:20
(15) в некоторых случаях удобней в виде скрипта... т.е. что б можно было править сразу

но мне лично, наверное все-таки удобней сразу сборку....
   The gray Cardinal
 
17 - 12.02.08 - 11:29
Отлично!!! Без проблем пашет на VBScript:
   
Set gl = CreateObject("Gepard.Loader")
gl.SetAdditionalAssemblysCount 2
gl.SetAdditionalAssembly "System.dll"
gl.SetAdditionalAssembly "System.Windows.Forms.dll"
strForBuild = vbCrLF
strForBuild = strForBuild & "using System.Windows.Forms;" & vbCrLF
strForBuild = strForBuild & "namespace ClassLibrary1" & vbCrLF
strForBuild = strForBuild & "{" & vbCrLF
strForBuild = strForBuild & "public class Class1" & vbCrLF
strForBuild = strForBuild & "{" & vbCrLF
strForBuild = strForBuild & "public void ShowMessage(string Message)" & vbCrLF
strForBuild = strForBuild & "{" & vbCrLF
strForBuild = strForBuild & "MessageBox.Show(Message);" & vbCrLF
strForBuild = strForBuild & "}" & vbCrLF
strForBuild = strForBuild & "}" & vbCrLF
strForBuild = strForBuild & "}" & vbCrLF
If gl.Build(strForBuild) Then
   Set newObj = gl.GetObject("ClassLibrary1.Class1")
   newObj.ShowMessage "Тестовое сообщение"
Else
   WScript.Echo "Ошибка компиляции!"
End If
18
19
   Jolly Roger
 
18 - 12.02.08 - 11:33
(17) чем-то мне это брэйнфак напоминает :-D
   Gepard
 
19 - 12.02.08 - 11:34
(17) а на VB.NET модуль не пробовал?20
   The gray Cardinal
 
20 - 12.02.08 - 11:42
(19) Сходу не могу, давно не ковырялся в VB.NET, уже поперезабыл всё на свете. Попытаюсь как-нибудь позже.
А как насчёт (4)? Имхо, нужно просто собрать твоё решение как exe-шник, который параметром хавает текстовый файл. Как передать в такой ситуации "AdditionalAssembly", надо подумать. Может, изобрести синтаксис какой для того же файла с исходником.
P.S. закралась смутная мысль: не изобретаем ли лисапед? :)))
21
   Gepard
 
21 - 12.02.08 - 11:43
(20) не знаю... делается легко... только смысла не вижу...22
23
31
   Gepard
 
22 - 12.02.08 - 11:44
(21) а вот (0) мне выгодно24
   The gray Cardinal
 
23 - 12.02.08 - 11:47
(21) Почему не видишь? Можно писать "скрипты", как на VBScript, но только на .NET. Ведь vbs-файл при двойном щелчке в Проводнике вульгарно исполняется с помощью wscript.exe - всё просто и удобно.
   The gray Cardinal
 
24 - 12.02.08 - 11:48
(22) А чем (0) выгодно? :))25
   Gepard
 
25 - 12.02.08 - 11:50
(24) ну что б 1С-ники знали еще и шарп... что б не принимали "в штыки" мою систему :)) т.к. у меня все модули будут на шарпе27
28
   Gepard
 
26 - 12.02.08 - 11:57
Хочу еще одну штуку пояснить:

Метод КомпилироватьСборку для одного и того же модуля надо делать один раз.

А вот получить объект - сколько угодно...

Если компилировать одну и ту же сборку для каждого нового объекта можно очень быстро забить память
   The gray Cardinal
 
27 - 12.02.08 - 11:59
(25) Не думаю, что наличие такой компоненты подвигнет кого-то на изучение шарпа :) Чтобы начать изучение шарпа, нужны другие причины. Компонента может прийтись в жилу тем, кто уже знает шарп хоть немного - это да.
А со "штыками" нужно озабачиваться в первую очередь, думая о пользователях. Нужно небольшое готовое решение, которое легко установить и которое стабильно работает - тогда возлюбят. Например, написать удобную микро-БД для хелпдеска - фигачим заявки для IT, конролируем ход их выполнения. Если систему возлюбят IT-шники - это будет большой рывок.
P.S. пошёл оффтоп :))
29
   The gray Cardinal
 
28 - 12.02.08 - 12:04
(25) Сподобишься на OpenSource - предлагаю свои услуги как разработчика доки ;)
   Gepard
 
29 - 12.02.08 - 12:04
(27) спасибо, я как раз об этом думал... еще сделать БД, куда можно вносить наименование компонентов системы, их описание и взяимосвязь...30
   Gepard
 
30 - 12.02.08 - 12:07
(29) т.е. хочешь поменять одну процедуру и сразу видишь, какие модули это затронет
   The gray Cardinal
 
31 - 12.02.08 - 12:10
(21) <скромно так> Сделал бы всё же exe-шничек, который файлы обрабатывает, а? :))32
33
   Gepard
 
32 - 12.02.08 - 12:11
(31) чуть позже напомни пожалуйста, сейчас надо хоть чуть поработать... а то я так  свою систему и не закончу :))34
   Gepard
 
33 - 12.02.08 - 12:13
(31) формат будет XML, там секция Reference, где будут описываться доп библиотеки и секция Code  с кодом34
   The gray Cardinal
 
34 - 12.02.08 - 12:25
(32) Почта есть, напомню конечно, даже не сомневайся :))
(33) Великолепная мысль! Кстати, есть формат WSF для Windows Script Host - полная аналогия! В секции "Code" - атрибут, имя языка.
 
Спасибо огромное! И дикие извинения, что второй день уже как выбил тебя из графика :)
41
   The gray Cardinal
 
35 - 13.02.08 - 23:43
Метод BuildVB() работает:
 
Set gl = CreateObject("Gepard.Loader")
gl.SetAdditionalAssemblysCount 1
gl.SetAdditionalAssembly "System.Windows.Forms.dll"
strForBuild = vbCrLF
strForBuild = strForBuild & "Imports System.Windows.Forms" & vbCrLF
strForBuild = strForBuild & "Public class Class1" & vbCrLF
strForBuild = strForBuild & "Public Sub ShowMessage(Message As String)" & vbCrLF
strForBuild = strForBuild & "MessageBox.Show(Message)" & vbCrLF
strForBuild = strForBuild & "End Sub" & vbCrLF
strForBuild = strForBuild & "End Class" & vbCrLF
If gl.BuildVB(strForBuild) Then
   Set newObj = gl.GetObject("Class1")
   newObj.ShowMessage "Привет, BuildVB!"
Else
   WScript.Echo "Ошибка компиляции!"
End If
 
А исходник можешь выложить?
36
   Gepard
 
36 - 14.02.08 - 08:16
(35) да этого в инете куча примеров http://read.excode.ru/art8081p4.html37
37
38
   Gepard
 
37 - 14.02.08 - 09:46
(36) + просто по предыдущей ветке (с чего все началось) там такой огромный пример был... и ничего подобного не встречалось...
а здесь всего лишь нужно в мой предыдущий пример добавить код из (36) и все...
   The gray Cardinal
 
38 - 14.02.08 - 09:47
(36) Я не понял, ты проект удалил? :))
Просто странно иметь одну dll'лину, а исходник от другой.
39
   Gepard
 
39 - 14.02.08 - 09:50
(38) нет конечно :D40
41
   The gray Cardinal
 
40 - 14.02.08 - 09:51
(39) Выложи, пожалуйста :))
   Gepard
 
41 - 14.02.08 - 09:52
(39) + просто он на полпути к (34)... т.е. вариант нерабочий42
44
   Gepard
 
42 - 14.02.08 - 09:54
(41) + если хочешь тебе на электронку отправляю, но выкладывать нет смысла... если чел разбирается он и так соберет из двух примеров нужный...43
44
   Gepard
 
43 - 14.02.08 - 09:54
(42) *отправлю
   The gray Cardinal
 
44 - 14.02.08 - 09:58
(42) Исходник часто нужен именно тем, кто "не разбирается". Именно с целью разобраться. Я, например, "не разбираюсь".
(41) Я так понял, будет решение, которое объединяет существующий функционал с новым? Если так, то "промежуточный" исходник, конечно, не особо нужен.
   Gepard
 
45 - 14.02.08 - 10:09
В общем исходник, может кто правда доделает... осталось там прикрутить Сохрание/загрузку и запуск из командной строки... У меня просто сейчас времени нет, может затянуться...

http://www.d01-soft.ru/downloads/com/LoaderEx.rar
46
67
67
   The gray Cardinal
 
46 - 14.02.08 - 11:01
(45) Я вообще смысла не понял :( А зачем там графический интерфейс и что с ним делать?47
   The gray Cardinal
 
47 - 14.02.08 - 11:08
+(46) Ладно, похоже я вообще неверно поставил задачу, и задача эта решается без написания кода .NET. Сейчас попробую сформулировать и решить сам, тогда отпишусь...48
49
   Gepard
 
48 - 14.02.08 - 11:18
(47) там интерфейс для формирования файлов нужного типа, а при работе с командной строки можно и не создавать форму51
   KLMR
 
49 - 14.02.08 - 11:30
(47) Чего тут формулировать? нужно консольное приложение, которое будет на входе получать параметр - путь к файлу. Соответственно компилировать его и выполнять скомпилированный код.
   Gepard
 
50 - 14.02.08 - 11:32
(49, 47) ну теперь у вас есть проект, можете курочить :))52
   KLMR
 
51 - 14.02.08 - 11:33
(48) Как то не красиво получается сначала задавать количество параметров, потом добавлять их. Почему например не использовать динамический массив? На один метод меньше выполнять всё-таки.52
53
   Gepard
 
52 - 14.02.08 - 11:36
(51) см. (50), а я закончу обучение своего ПО правилам русского языка и доделаю свою версию53
   Gepard
 
53 - 14.02.08 - 11:41
(52) но в (51) дельное предложение
   Gepard
 
54 - 14.02.08 - 11:41
я просто эту штуку минут за 30 наваял... само собой нужен рефакторинг
   The gray Cardinal
 
55 - 14.02.08 - 14:37
Моё решение задачи:
 
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.VB]
@="vbfile"

[HKEY_CLASSES_ROOT\vbfile]

[HKEY_CLASSES_ROOT\vbfile\shell]

[HKEY_CLASSES_ROOT\vbfile\shell\open]
@="Открыть в SciTE"

[HKEY_CLASSES_ROOT\vbfile\shell\open\command]
@="\"C:\\Program Files\\SciTE\\SciTE.exe\" \"%1\""

[HKEY_CLASSES_ROOT\vbfile\shell\open1]
@="Скомпилировать .NET (консоль)"

[HKEY_CLASSES_ROOT\vbfile\shell\open1\command]
@="cmd /k \"\"C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe\" \"%1\" /out:\"%1.exe\"\""

[HKEY_CLASSES_ROOT\vbfile\shell\open2]
@="Скомпилировать и запустить .NET (консоль)"

[HKEY_CLASSES_ROOT\vbfile\shell\open2\command]
@="cmd /k \"\"C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe\" \"%1\" /out:\"%1.exe\" && \"%1.exe\"\""

[HKEY_CLASSES_ROOT\vbfile\shell\open3]
@="Скомпилировать .NET (win)"

[HKEY_CLASSES_ROOT\vbfile\shell\open3\command]
@="cmd /k \"\"C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe\" \"%1\" /out:\"%1.exe\" /target:winexe\""

[HKEY_CLASSES_ROOT\vbfile\shell\open4]
@="Скомпилировать и запустить .NET (win)"

[HKEY_CLASSES_ROOT\vbfile\shell\open4\command]
@="cmd /k \"\"C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe\" \"%1\" /out:\"%1.exe\" /target:winexe && \"%1.exe\"\""
 
После этого создать текстовый файл с расширением .VB, например:
 
Imports System.Windows.Forms
Public Class WinForm
   Inherits System.Windows.Forms.Form
   Private b As New Button()
   Public Sub New()
       MyBase.New()
       MyBase.Topmost = True
       MyBase.Text = "Кнопка с текущим временем"
       b.Dock = DockStyle.Fill
       b.Text = Now()
       AddHandler b.Click, AddressOf b_Click
       MyBase.Controls.Add(b)
       MyBase.Show()
   End Sub
   Public Sub b_Click(ByVal sender As Object, ByVal e As EventArgs)
       b.Text = Now()
   End Sub
   Public Shared Sub Main()
       System.Windows.Forms.Application.Run(New WinForm())
   End Sub
End Class
 
Открыть контекстное меню Проводника на vb-файле и наслаждаться :)
56
61
67
   KLMR
 
56 - 14.02.08 - 16:59
(55) Блин, прежде чем просить написать, стоило бы изучить существующие возможности :)57
60
   Gepard
 
57 - 14.02.08 - 17:07
(56) здесь только один недостаток - файл .exe остается60
   Gepard
 
58 - 14.02.08 - 17:10
а где References?59
61
   Gepard
 
59 - 14.02.08 - 17:10
(58) + там же их тоже надо в ком.строке указывать
   The gray Cardinal
 
60 - 14.02.08 - 17:30
(56)(57) Есть "недостатки". Во-первых, действительно - файл .exe остается, во-вторых - мешаются на экране чёрные окна. Хотя, может быть, всё это действительно не так уж и страшно, или даже хорошо... :)))
Но полюбому, имхо, xml-формат, аналогичный WSF, был бы просто красивым решением. Ещё более красивое решение - расширение реального WSF-формата языками .NET. А заодно и реального WSC-формата. ;)
65
67
   The gray Cardinal
 
61 - 14.02.08 - 17:32
(58) Не знай. А зачем их надо в командной строке указывать, если в исходнике всё прописано? У меня то, что в (55), работает без вопросов, вроде.62
   Gepard
 
62 - 14.02.08 - 18:34
(61) у меня так не работает (в loader)... видимо тут сам exe файл смотрит что еще нужно подключить
   Gepard
 
63 - 14.02.08 - 19:21
кстати, а по поводу Exe оставшегося нельзя делать так:
@="cmd /k \"\"C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe\" \"%1\" /out:\"%1.exe\" && \"%1.exe\"&& \"cmd /y del %1.exe\"\""
?
64
66
   Gepard
 
64 - 14.02.08 - 19:24
(63) только похоже /y не нужен
   KLMR
 
65 - 14.02.08 - 19:48
(60) Хотел ещё спросить мнение о HTA. Что думаешь?66
   The gray Cardinal
 
66 - 14.02.08 - 21:45
(63) Наверное, можно. Но, вобщем, это сильно дела не меняет :)
(65) HTA, имхо, не при чём.
   The gray Cardinal
 
67 - 14.02.08 - 22:43
Я так понял, дописывать (45) желания большого нет.
В принципе, не настаиваю, т.к. в (55) уже кое-как решено, хотя дотнетовским exe-шником, конечно, можно было бы сделать в сто раз красивее, см. (60).
 
Но есть просьба: привести исходник обратно к виду (0) и выложить ;)
Просто, может у кого будет желание развить, когда-нибудь. А то в (45) я вообще не вьехал, да и непонятно как-то, "с середины на половину".
68
   Gepard
 
68 - 14.02.08 - 22:56
(67) в том архиве есть исходик и из (0)69
   Gepard
 
69 - 14.02.08 - 23:00
(68) + там два проекта... один EXE, и он использует второй (DLL)71
   The gray Cardinal
 
70 - 14.02.08 - 23:32
Не понял, а какой основной файл .cs относится к (0)?
   The gray Cardinal
 
71 - 15.02.08 - 15:36
(69) Всё, разобрался, спасибо.
   Gepard
 
72 - 16.02.08 - 18:47
чуть приподнимем
   The gray Cardinal
 
73 - 19.02.08 - 15:32
По поводу расширения форматов WSF и WSC языками .NET:
http://msdn2.microsoft.com/en-us/library/xawadt95(VS.85).aspx
Может, осилит кто? ;)

 

Список тем форума

Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 500 человек.