2016-12-18 2 views
0

Ich habe versucht, eine DLL zu implementieren, die im Grunde als COM-Objekt registriert, die über einige externe Dienste (RMS - Retail Management Solution) aufgerufen werden.COM-Objekt mit Windows Form Funktionalität fehlgeschlagen

Also, um die DLL zu implementieren habe ich ein Bibliotheksprojekt erstellt, fügen Sie Windows-Formularfunktionalität, die einige Schaltflächen, Felder usw. anzeigen, und dann diese DLL registriert in Assembly so externen Service kann leicht darauf zugreifen.

Um diese DLL zu testen, habe ich ein Console-Projekt erstellt, fügen Sie die DLL in und es funktioniert gut. Wenn ich jedoch in Assemblys registriert bin und externe Services (RMS) versuchen, sie aufzurufen, wird kein Windows Form geöffnet und die folgende Ausnahme wird angezeigt. "Versuch, COM-Objekt auszuführen fehlgeschlagen. Interner Fehler gefunden".

FYI - Ich habe Windows.Forms und System.Drawing-Referenz hinzugefügt.

Um es noch weiter zu debuggen, habe ich eine Message-Box hinzugefügt, die perfekt heißt, dass die DLL korrekt registriert ist.

Transaktion

using QSRules; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Text; 
using System.Windows.Forms; 

    namespace Sales 
    { 
    public class Transaction 
    { 
    public Boolean Process(Object session) 
    { 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Service()); 
    return true; 
    } 
    } 
    } 

zweite Klasse ist "Service" genannt, das Formular Windows Forms-Komponenten wie Buttons etc

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace Sales 
{ 
public partial class Service : Form 
{ 
/// <summary> 
/// Required designer variable. 
/// </summary> 
private System.ComponentModel.IContainer components = null; 

public Service() 
{ 
System.Windows.Forms.MessageBox.Show("In Service"); 
InitializeComponent(); 
System.Windows.Forms.MessageBox.Show("Loaded Successfully"); 
} 
/// <summary> 
/// Clean up any resources being used. 
/// </summary> 
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
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.button1 = new System.Windows.Forms.Button(); 
this.SuspendLayout(); 
// 
// button1 
// 
this.button1.Location = new System.Drawing.Point(76, 109); 
this.button1.Name = "button1"; 
this.button1.Size = new System.Drawing.Size(75, 23); 
this.button1.TabIndex = 0; 
this.button1.Text = "button1"; 
this.button1.UseVisualStyleBackColor = true; 
this.button1.Click += new System.EventHandler(this.button1_Click); 
// 
// Service 
// 
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
this.ClientSize = new System.Drawing.Size(284, 262); 
this.Controls.Add(this.button1); 
this.Name = "Service"; 
this.Text = "Service"; 
this.Load += new System.EventHandler(this.Service_Load); 
this.ResumeLayout(false); 

} 

#endregion 

private System.Windows.Forms.Button button1; 

private void button1_Click(object sender, EventArgs e) 
{ 

} 

private void Service_Load(object sender, EventArgs e) 
{ 

} 
} 
} 

Jede Idee zur Anzeige erstreckt? warum es fehlgeschlagen ist.

+0

Fehlende Referenzen? – NtFreX

+0

Danke für die Antwort. Referenz von was? Ich habe Windows.Forms und System.Drawing-Referenz hinzugefügt. Übrigens, es funktioniert, wenn ich es über die Konsolenanwendung teste – user1030128

Antwort

0

Nur eine Lösung gefunden. Das Problem wurde mit dem folgenden Link in Verbindung gebracht

Application.Run (neuer Service());

Application.Run unterstützt nicht, wenn eine Komponente als COM-Objekt registriert ist. SO machen t funktioniert, ich entfernte die Appliation.Run und rufen Sie ShowDialog Methode mit Service.

neuer Dienst(). ShowDialog()