Velena Skrevet 10. april 2009 Del Skrevet 10. april 2009 Fikk nettopp inspirasjon til å se nærmere på System.CodeDom namespacet, og bestemte meg for å prøve å lage en enkel exe generator. Jeg har kommet så langt som å kunne skape koden, men når jeg kompilerer den oppstår det problemer. Mer spesifikt vil ikke .EXE filen som blir laget la seg kjøre, men gir en melding om at det har oppstått et problem med programmet som gjør at det må lukkes. En annen ting som er veldig merkelig er at jeg prøvde på et program med et GUI, men når jeg kjører programmet kommer det opp et konsollvindu før feilmeldingen kommer. Er det noen spesielle parameter jeg må bruke for å spesifisere at programmet skal ha et GUI? I tilfelle det er relevant, legger jeg til koden som blir generert: //------------------------------------------------------------------------------ // <auto-generated> // Koden er generert av et verktøy. // Kjøretidsversjon:2.0.50727.1433 // // Endringer i denne filen kan føre til feil virkemåte, og vil gå tapt hvis // koden genereres på nytt. // </auto-generated> //------------------------------------------------------------------------------ namespace jhkjh { using System; using System.Windows.Forms; public class Program { /// <summary> /// The main entry point for the application. /// </summary> [sTAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Main()); } } public partial class Main { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); this.GameFObject = new AxShockwaveFlashObjects.AxShockwaveFlash(); ((System.ComponentModel.ISupportInitialize)(this.GameFObject)).BeginInit(); this.SuspendLayout(); // // GameFObject // this.GameFObject.Enabled = true; this.GameFObject.Location = new System.Drawing.Point(0, 0); this.GameFObject.Name = "GameFObject"; this.GameFObject.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("GameFObject.OcxState"))); this.GameFObject.Size = new System.Drawing.Size(550, 550); this.GameFObject.TabIndex = 0; this.GameFObject.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.GameFObject_PreviewKeyDown); // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(551, 551); this.Controls.Add(this.GameFObject); this.Name ="Main"; this.Text ="Main"; this.Load += new System.EventHandler(this.Main_Load); ((System.ComponentModel.ISupportInitialize)(this.GameFObject)).EndInit(); this.ResumeLayout(false); } #endregion private AxShockwaveFlashObjects.AxShockwaveFlash GameFObject; } public partial class Main : Form { Hack_List hacks; public Main() { InitializeComponent(); } private void Main_Load(object sender, EventArgs e) { GameFObject.Movie ="bhbhbh"; } public void SetGameVariable(string variable, string value) { GameFObject.SetVariable(variable, value); } private void GameFObject_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { KeysConverter converter = new KeysConverter(); if (e.KeyCode == (Keys)converter.ConvertFromString("M")) if (!(Application.OpenForms.Count > 1)){ hacks = new Hack_List(); hacks.Show(); hacks.SetForm(this); } } } public partial class Hack_List { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.ValueTBox = new System.Windows.Forms.TextBox(); this.DescLbl = new System.Windows.Forms.Label(); this.FreezeCBox = new System.Windows.Forms.CheckBox(); this.SetBtn = new System.Windows.Forms.Button(); this.SuspendLayout(); // // ValueTBox // this.ValueTBox.Location = new System.Drawing.Point(81, 12); this.ValueTBox.Name = "ValueTBox"; this.ValueTBox.Size = new System.Drawing.Size(71, 20); this.ValueTBox.TabIndex = 0; this.ValueTBox.Text = "Default value"; // // DescLbl // this.DescLbl.AutoSize = true; this.DescLbl.Location = new System.Drawing.Point(12, 15); this.DescLbl.Name = "DescLbl"; this.DescLbl.Size = new System.Drawing.Size(63, 13); this.DescLbl.TabIndex = 1; this.DescLbl.Text = "Description:"; // // FreezeCBox // this.FreezeCBox.AutoSize = true; this.FreezeCBox.Location = new System.Drawing.Point(158, 15); this.FreezeCBox.Name = "FreezeCBox"; this.FreezeCBox.Size = new System.Drawing.Size(15, 14); this.FreezeCBox.TabIndex = 2; this.FreezeCBox.UseVisualStyleBackColor = true; // // SetBtn // this.SetBtn.Location = new System.Drawing.Point(179, 10); this.SetBtn.Name = "SetBtn"; this.SetBtn.Size = new System.Drawing.Size(37, 23); this.SetBtn.TabIndex = 3; this.SetBtn.Text = "Set"; this.SetBtn.UseVisualStyleBackColor = true; this.SetBtn.Click += new System.EventHandler(this.SetBtn_Click); // // Hack_List // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(230, 48); this.Controls.Add(this.SetBtn); this.Controls.Add(this.FreezeCBox); this.Controls.Add(this.DescLbl); this.Controls.Add(this.ValueTBox); this.Name = "Hack_List"; this.Text = "Hack_List"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox ValueTBox; private System.Windows.Forms.Label DescLbl; private System.Windows.Forms.CheckBox FreezeCBox; private System.Windows.Forms.Button SetBtn; } public partial class Hack_List : Form { public string[] variables = {""}; Main mainForm; public Hack_List() { InitializeComponent(); } public void SetForm(Main main) { mainForm = main; } private void SetBtn_Click(object sender, EventArgs e) { mainForm.SetGameVariable(variables[0], ValueTBox.Text); } } } Jeg tror at problemet med at programmet krasjer har å gjøre med at jeg ikke inkluderer Main.resx, som ser ut til å være nødvendig for at koden skal kjøre (Prøvde å fjerne denne fra malen jeg brukte, noe som førte til at jeg ikke kunne debugge programmet). Den inneholder et entry kallt "GameFObject.ocxState" med typen "System.Windows.Forms.AxHost+State". Det andre spørsmålet blir da hvordan jeg inkluderer denne informasjonen i kildekoden? Takker for alle svar/forslag/etc. Lenke til kommentar
GeirGrusom Skrevet 10. april 2009 Del Skrevet 10. april 2009 (endret) Det er mange ting her using skal stå utenfor namespace ActiveX objekter blir inkludert ved at Visual Studio auto-genererer en wrapper for klassene og ikke kall Formen din Main (dette navnet er ttvetydig med funksjonen main) Husk også at under AnyCPU så vil .NET kompilere til 64-bit, og i motsetning til Mac OS og Linux, så kan ikke 32-bit og 64-bit kode blandes. Endret 10. april 2009 av GeirGrusom Lenke til kommentar
Velena Skrevet 10. april 2009 Forfatter Del Skrevet 10. april 2009 Takk igjen for raskt svar GeirGrusom =), men det er fremdeles noen ting jeg er usikker på: Jeg tar det slik at namespace referansene ikke burde legges til som dette? CodeNamespace trainerNamespace = new CodeNamespace(TNameTBox.Text); trainerNamespace.Imports.Add(new CodeNamespaceImport("System")); trainerNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms")); Hvordan burde jeg gjøre det for at de skal komme utenfor namespacet? Har forresten endret navnet på Main nå. Desverre får jeg fortsatt opp den samme feilmeldingen. Prøvde også å finne ut hvordan jeg spesifiserer at jeg vil kompilere en 32-bits exe, er dette riktig? CompilerParameters.CompilerOptions = "/platform:x86"; ActiveX objekter blir inkludert ved at Visual Studio auto-genererer en wrapper for klassene Du skulle ikke vite hvordan jeg genererer en slik klasse ved hjelp av CodeDOM? Lenke til kommentar
GeirGrusom Skrevet 10. april 2009 Del Skrevet 10. april 2009 Hmmm nei. Etter det jeg vet, er det et program som følger med Visual Studio som gjør dette, men jeg er svært usikker. Lenke til kommentar
Velena Skrevet 11. april 2009 Forfatter Del Skrevet 11. april 2009 (endret) Fant et program som gjør dette for meg (Resource Wrapper), problemet er bare det at det virker til å være to feil i koden den genererer public System.Windows.Forms.AxHost+State GameFObject_OcxState // Invalid token '+'in class, struct or member declaration { get { if (!_isLoaded) Init(); return (System.Windows.Forms.AxHost+State)_resources.GetObject(GAMEFOBJECT_OCXSTATE);// Regner med at det er + tegnet som skaper krøll her også, men feilen lyder: ; expected } } Kan jeg bare fjerne '+State', eller vil det ikke fungere(Har aldri sett en slik type før >.>)? Endret 11. april 2009 av Velena Lenke til kommentar
GeirGrusom Skrevet 11. april 2009 Del Skrevet 11. april 2009 Jeg har aldri sett + i navnet på en klasse før, og siden det ikke kompilerer, er det nok feil. Sjekk hva intellisense sitt nærmeste forslag er. Lenke til kommentar
Velena Skrevet 11. april 2009 Forfatter Del Skrevet 11. april 2009 Mener du Error help? Det eneste forslaget jeg fant der var "fjern + tegnet". Fant forresten ut at State er en klasse i AxHost, hjelper det noe? Lenke til kommentar
Velena Skrevet 16. april 2009 Forfatter Del Skrevet 16. april 2009 Får fortsatt den samme feilmeldingen, kan det hende at det er denne koden som er gal? MainForm designer kode .. //MainForm designer kode private void InitializeComponent() { ResourceManagement resourceM = new ResourceManagement(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.GameFObject = new AxShockwaveFlashObjects.AxShockwaveFlash(); ((System.ComponentModel.ISupportInitialize)(this.GameFObject)).BeginInit(); this.SuspendLayout(); // // GameFObject // this.GameFObject.Enabled = true; this.GameFObject.Location = new System.Drawing.Point(0, 0); this.GameFObject.Name = "GameFObject"; // this.GameFObject.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("GameFObject.OcxState"))); this.GameFObject.OcxState = ((System.Windows.Forms.AxHost.State)(resourceM.GetObject("GameFObject.OcxState"))); this.GameFObject.Size = new System.Drawing.Size(550, 550); this.GameFObject.TabIndex = 0; this.GameFObject.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.GameFObject_PreviewKeyDown); // // Main // .................. ((System.ComponentModel.ISupportInitialize)(this.GameFObject)).EndInit(); this.ResumeLayout(false); } wrapper klassen public class ResourceManagement { #region Member Variables // resource file to be used as default private const string RESOURCE_FILE = "ATrainer.ResourceManagement"; // declare constants used for resource keys private const string GAMEFOBJECT_OCXSTATE ="GameFObject.OcxState"; // declare objects needed for resource management private ResourceManager _resources; private bool _isLoaded; #endregion #region Constructors and Init public ResourceManagement() { Init(); } public ResourceManagement(string fileName) { Init(fileName); } private void Init() { Init(RESOURCE_FILE); } // load the resourcemanager private void Init(string fileName) { try { Assembly assembly = Assembly.GetExecutingAssembly(); _resources = new ResourceManager(fileName, assembly); _isLoaded = true; } catch { _isLoaded = false; } } #endregion #region Public Properties public System.Windows.Forms.AxHost.State GameFObject_OcxState { get { if (!_isLoaded) Init(); return (System.Windows.Forms.AxHost.State)_resources.GetObject(GAMEFOBJECT_OCXSTATE); } } #endregion #region Generic Wrappers // get a string public string GetString(string name) { if (!_isLoaded ) Init(); return _resources.GetString(name); } // get an object public object GetObject(string name) { if (!_isLoaded ) Init(); return _resources.GetObject(name); } // get an image public Image GetImage(string name) { if (!_isLoaded ) Init(); return (Image)_resources.GetObject(name); } // get an icon public Icon GetIcon(string name) { if (!_isLoaded ) Init(); return (Icon)_resources.GetObject(name); } #endregion } Lenke til kommentar
GeirGrusom Skrevet 16. april 2009 Del Skrevet 16. april 2009 Hmmmm Hva skjer hvis du debugger programmet med Visual Studio da? Lenke til kommentar
Velena Skrevet 16. april 2009 Forfatter Del Skrevet 16. april 2009 (endret) Designeren skrev:Could not find type 'ResourceManagement'. Please make sure that the assembly that contains this type is referenced. If this type is a part of your development project, make sure that the project has been successfully built. Jeg ser ingen grunn til at kompilatoren ikke skal finne den, den er jo definert i samme namespace som en public class. Edit: Dette vises faktisk bare som en warning, den eneste erroren er at den ikke finner AxShockwaveFlashObjets, noe som er mer forståelig, ettersom referansen til namespacet av en eller annen grunn ikke har blitt lagt til i filen. Her er koden som skulle legge denne til, i tilfelle jeg gjør noe galt der: String[] referenceAssemblies = { "System.dll", "System.Drawing.dll", "System.Windows.Forms.dll", "Interop.ShockwaveFlashObjects.dll", "AxInterop.ShockwaveFlashObjects.dll" }; CompilerParameters cp = new CompilerParameters(referenceAssemblies, TNameTBox.Text+".exe", false); Endret 16. april 2009 av Velena Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå