Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: exe файлы Добавлено: 10.08.09 13:00  

Автор вопроса:  ☺♣FIO♣☺
Как создать программно исполняемые ехе файл? допустим, есть программа в которой юзер выбирает сколько кнопок будет на форме. далее нажимает кнопку пуск и программа создает в папке ехе файл. Далее запускаем этот файл и должна появиться форма с кнопками. Это ваще реально? Мнеб хотябы создавать ехе файл с формой(программно). Может записывать какито данные в двоичный(binary) файл? Ну очень нуно=) Спасибо заранее.

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 10.08.09 14:29
а чем тебе не угодило создать прогу, которая из файла настроек будет считывать кол-во кнопок и делать стока?

Ответить

Номер ответа: 2
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #2 Добавлено: 11.08.09 14:51
В принципе это реально.(Пример под Visual Basic 6.0)
По идее надо сбацать 2 проги:
1)В первую твой юзер загоняет что ему и где надо, после чего прога записывает это всё в текстовый файл,
2)А вторая прога считывает данные из текстового файла и перестраевается по тем параметрам которые в этом файле описаны.Т.е. во второй проге ты создаёш массив элементов(всех которые есть) и ставиш им свойство .Visible = False. При загрузке формы она считывает из файла количество кнопок, текстбоксов и т.д. и расставляет их на форме.
Для справки:
Чтобы создать на форме кнопку нужно сделать массив переменных( просто жмёш копировать, после вставить и на вопрос отвечаеш да), и в коде написать:
  1.  
  2. Load Command1("индекс контрола(числа от 1 до бесконечности, 0 не берётся т.к исходный контрол имеет индекс 0")
  3. 'И дальше пишеш координаты, цвет, надпись и т.д.
  4. 'И обязательно надо написать
  5. Command1("индекс").Visible = True


Аналогично это делается и для других контролов.

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 11.08.09 17:53
Под .NET нет массивов контролов

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 11.08.09 18:18
Кстати посмотри еще в сторону WPF, там есть что-то подобное - можно декларативно описать в XML весь интерфейс а потом отобразить его

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 11.08.09 18:22
К тому же там кроме XML-формата (XAML) есть и бинарный формат (BAML называется вроде)

Ответить

Номер ответа: 6
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #6
Добавлено: 11.08.09 23:08
вопщем я так думаю тут или первая прога создает какойто файл, а вторая читает и делает чо нада (это самый простой вариант), второй вариант - WPF тоже не так сложно, третий вариант - это если хошь стать великим мастером компиляции, выглядит это примерно вот так и представляет собой полную жопу:
  1.  
  2. Dim name As New AssemblyName("newexe")
  3.  
  4.         Dim asmb As Emit.AssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(name, Emit.AssemblyBuilderAccess.Save)
  5.  
  6.         Dim modb As Emit.ModuleBuilder = asmb.DefineDynamicModule("newexe.exe")
  7.  
  8.         Dim formBuilder As Emit.TypeBuilder = modb.DefineType("Form1", TypeAttributes.AnsiClass Or TypeAttributes.AutoClass _
  9.                                                               Or TypeAttributes.Public Or TypeAttributes.BeforeFieldInit, _
  10.                                                               GetType(Form))
  11.  
  12.         Dim constrBuilder As Emit.ConstructorBuilder = formBuilder.DefineConstructor(MethodAttributes.Public _
  13.                                                                                             Or MethodAttributes.HideBySig Or MethodAttributes.SpecialName Or MethodAttributes.RTSpecialName, CallingConventions.Standard, New Type() {})
  14.         Dim fieldBuilder As Emit.FieldBuilder = formBuilder.DefineField("components", GetType(System.ComponentModel.IContainer), FieldAttributes.Private)
  15.  
  16.         Dim methb As Emit.MethodBuilder = formBuilder.DefineMethod("InitializeComponent", MethodAttributes.Private Or MethodAttributes.HideBySig)
  17.  
  18.         Dim il As Emit.ILGenerator = methb.GetILGenerator()
  19.         il.Emit(Emit.OpCodes.Nop)
  20.         il.Emit(Emit.OpCodes.Ldarg_0)
  21.         il.Emit(Emit.OpCodes.Newobj, GetType(System.ComponentModel.Container).GetConstructor(New Type() {}))
  22.         il.Emit(Emit.OpCodes.Stfld, fieldBuilder)
  23.         il.Emit(Emit.OpCodes.Ldarg_0)
  24.         il.Emit(Emit.OpCodes.Ldc_I4_1)
  25.         il.Emit(Emit.OpCodes.Call, GetType(System.Windows.Forms.ContainerControl).GetMethod("set_AutoScaleMode"))
  26.         il.Emit(Emit.OpCodes.Nop)
  27.         il.Emit(Emit.OpCodes.Ldarg_0)
  28.         il.Emit(Emit.OpCodes.Ldstr, "Form1")
  29.         il.Emit(Emit.OpCodes.Callvirt, GetType(System.Windows.Forms.Control).GetMethod("set_Text"))
  30.         il.Emit(Emit.OpCodes.Nop)
  31.         il.Emit(Emit.OpCodes.Ret)
  32.  
  33.         il = constrBuilder.GetILGenerator
  34.         il.Emit(Emit.OpCodes.Ldarg_0)
  35.         il.Emit(Emit.OpCodes.Ldnull)
  36.         il.Emit(Emit.OpCodes.Stfld, fieldBuilder)
  37.         il.Emit(Emit.OpCodes.Ldarg_0)
  38.         il.Emit(Emit.OpCodes.Call, GetType(System.Windows.Forms.Form).GetConstructor(New Type() {}))
  39.         il.Emit(Emit.OpCodes.Nop)
  40.         il.Emit(Emit.OpCodes.Nop)
  41.         il.Emit(Emit.OpCodes.Ldarg_0)
  42.         il.Emit(Emit.OpCodes.Call, methb)
  43.         il.Emit(Emit.OpCodes.Nop)
  44.         il.Emit(Emit.OpCodes.Nop)
  45.         il.Emit(Emit.OpCodes.Ret)
  46.  
  47.         methb = formBuilder.DefineMethod("Dispose", MethodAttributes.Family Or MethodAttributes.HideBySig Or MethodAttributes.Virtual, GetType(Void), New Type() {GetType(Boolean)})
  48.         Dim paramBuilder As Emit.ParameterBuilder = methb.DefineParameter(1, ParameterAttributes.None, "disposing")
  49.  
  50.         il = methb.GetILGenerator()
  51.         il.DeclareLocal(GetType(Boolean))
  52.         Dim lab1 As Emit.Label = il.DefineLabel()
  53.         Dim lab2 As Emit.Label = il.DefineLabel()
  54.         Dim lab3 As Emit.Label = il.DefineLabel()
  55.         il.Emit(Emit.OpCodes.Nop)
  56.         il.Emit(Emit.OpCodes.Ldarg_1)
  57.         il.Emit(Emit.OpCodes.Brfalse_S, lab1)
  58.         il.Emit(Emit.OpCodes.Ldarg_0)
  59.         il.Emit(Emit.OpCodes.Ldfld, fieldBuilder)
  60.         il.Emit(Emit.OpCodes.Ldnull)
  61.         il.Emit(Emit.OpCodes.Ceq)
  62.         il.Emit(Emit.OpCodes.Br_S, lab2)
  63.         il.MarkLabel(lab1)
  64.         il.Emit(Emit.OpCodes.Ldc_I4_1)
  65.         il.MarkLabel(lab2)
  66.         il.Emit(Emit.OpCodes.Stloc_0)
  67.         il.Emit(Emit.OpCodes.Ldloc_0)
  68.         il.Emit(Emit.OpCodes.Brtrue_S, lab3)
  69.         il.Emit(Emit.OpCodes.Nop)
  70.         il.Emit(Emit.OpCodes.Ldarg_0)
  71.         il.Emit(Emit.OpCodes.Ldfld, fieldBuilder)
  72.         il.Emit(Emit.OpCodes.Callvirt, GetType(System.IDisposable).GetMethod("Dispose"))
  73.         il.Emit(Emit.OpCodes.Nop)
  74.         il.Emit(Emit.OpCodes.Nop)
  75.         il.MarkLabel(lab3)
  76.         il.Emit(Emit.OpCodes.Ldarg_0)
  77.         il.Emit(Emit.OpCodes.Ldarg_1)
  78.         Dim q As MethodInfo = GetType(System.Windows.Forms.Form).GetMethod("Dispose", BindingFlags.CreateInstance Or BindingFlags.DeclaredOnly Or BindingFlags.Default Or BindingFlags.ExactBinding Or BindingFlags.FlattenHierarchy Or BindingFlags.GetField Or BindingFlags.GetProperty Or BindingFlags.IgnoreCase Or BindingFlags.IgnoreReturn Or BindingFlags.Instance Or BindingFlags.InvokeMethod Or BindingFlags.NonPublic Or BindingFlags.OptionalParamBinding Or BindingFlags.Public Or BindingFlags.PutDispProperty Or BindingFlags.PutRefDispProperty Or BindingFlags.SetField Or BindingFlags.SetProperty Or BindingFlags.Static Or BindingFlags.SuppressChangeType, Nothing, CallingConventions.Standard, New Type() {GetType(Boolean)}, Nothing)
  79.         il.Emit(Emit.OpCodes.Call, q)
  80.         il.Emit(Emit.OpCodes.Nop)
  81.         il.Emit(Emit.OpCodes.Ret)
  82.  
  83.         Dim typeBuilder As Emit.TypeBuilder = modb.DefineType("Program", TypeAttributes.Abstract Or TypeAttributes.AnsiClass _
  84.                                                               Or TypeAttributes.AutoClass Or TypeAttributes.Sealed _
  85.                                                               Or TypeAttributes.BeforeFieldInit Or TypeAttributes.NotPublic, _
  86.                                                               GetType(Object))
  87.         methb = typeBuilder.DefineMethod("Main", MethodAttributes.HideBySig Or MethodAttributes.Private _
  88.                                                                    Or MethodAttributes.Static, Type.GetType("Void"), Type.EmptyTypes)
  89.         methb.SetCustomAttribute(GetType(STAThreadAttribute).GetConstructor(New Type() {}), New Byte() {})
  90.         il = methb.GetILGenerator()
  91.         il.Emit(Emit.OpCodes.Nop)
  92.         il.Emit(Emit.OpCodes.Call, GetType(System.Windows.Forms.Application).GetMethod("EnableVisualStyles"))
  93.         il.Emit(Emit.OpCodes.Nop)
  94.         il.Emit(Emit.OpCodes.Ldc_I4_0)
  95.         il.Emit(Emit.OpCodes.Call, GetType(System.Windows.Forms.Application).GetMethod("SetCompatibleTextRenderingDefault"))
  96.         il.Emit(Emit.OpCodes.Nop)
  97.         il.Emit(Emit.OpCodes.Newobj, constrBuilder)
  98.         il.Emit(Emit.OpCodes.Call, GetType(System.Windows.Forms.Application).GetMethod("Run", New Type() {GetType(System.Windows.Forms.Form)}))
  99.         il.Emit(Emit.OpCodes.Nop)
  100.         il.Emit(Emit.OpCodes.Ret)
  101.         typeBuilder.CreateType()
  102.         formBuilder.CreateType()
  103.         modb.CreateGlobalFunctions()
  104.         asmb.SetEntryPoint(methb, Emit.PEFileKinds.WindowApplication)
  105.         asmb.Save("newexe.exe")



этот код создаст новый файл newexe.exe с пустой формой, я тебе этот метод очень не рекоммендую, весь моск себе вынес, пока писал этот пример

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 11.08.09 23:48
ну тогда можно и через CodeDOM

Ответить

Страница: 1 |

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



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