[COM]regasm ok und trotzdem wird die Componente nicht gefunden

mschlegel

Erfahrenes Mitglied
Hi

Wir haben eine etwas ältere Anwendung die in Delphi 2006 geschrieben ist. Wir wollen aber das ganze Projekt bald auf .NET umstellen (hoffentlich innerhalb des nächsten Jahres) und haben deshalb schon einmal begonnen die Berichte auf MS Reporting Service umzustellen. Um diese anzuzeigen haben wir eine ClassLibrary die entweder über .NET oder über COM angesprochen werden kann.

Für die COM-Schnittstelle habe ich ein Interface welches eigentlich nur eine Methode beinhaltet und eine Klasse die dieses und ein weiteres Iterfaces implementiert.

Lange Rede kurzer Sinn, die TypeLibrary für Delphi wird erfolgreich erzeugt und der Delphi-Code zum instanziieren des COM-Objektes wird erfolgreich kompiliert. Allerdings bekomme ich zur Laufzeit die Meldung dass die Komponente mit der GUID ... nicht gefunden werden kann. Die GUID entspricht der GUID die ich in meiner Klasse eingetragen habe.

das Interface
C#:
[assembly: AssemblyKeyFile("DynamicreportViewer.snk")] // GAC
namespace Stiki.DynamicReportViewer
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [Guid("A6659361-1625-5555-931C-36014B146679")]
	public interface ICOMReportViewer
	{	
		void ShowReport(string reportName, String[]parameters);
	}
}

die implementierende Klasse
C#:
namespace Stiki.DynamicReportViewer
{
    // Don't generate class interface - inheritance using interfaces!
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("C6659361-1625-4746-931C-36014B146679")] // <----- Diese GUID wird nicht gefunden
    [ComVisible(true)]
    [ProgId("Stiki.DynamicReportViewer.ReportViewer")]
	public class ReportViewer : IReportViewer, ICOMReportViewer
	{
		private static ReportViewer singleton;

		private ReportViewer() { }

		public static ReportViewer GetReportViewer()
		{
			if (singleton == null)
				singleton = new ReportViewer();
			return singleton;
		}

		void ICOMReportViewer.ShowReport(string reportName, String[]parameters)
		{
			// tue dies und das
		}
	}// end class
}

Um die DLL zu registrieren rufe ich regasm bla.dll /tlb /codebas auf und nach noch gacutil -i bla.dll. Eigentlich sollte das Ding doch dann gefunden werden?
 
Also irgendwie funktioniert es jetzt. Ich habe einfach regasm ohne den /tlb parameter aufgerufen.

Allerdings zerschießt es mir jetzt irgendeinen Assemblercode (accessviolation at 0x77... write of address 0x000... Process stopped)!
 
Hallo,

ich habe genau das selbe Problem. Ich brauche eine .Net Klasse die ich unter COM verwenden muss.
Meine Umgebung ist VS 2008 in C#.
Dazu habe ich einen Schlüssel mit sn -k meiner DLL erzeugt und in genau das selbe Verzeichnis eingefügt.
Wenn ich jetzt allerdings den Auffruf
Code:
[assembly: AssemblyKeyFile("TemperatureComponent.snk")]
starte kommt immer die Fehlermeldung das mein .snk Datei nicht gefunden wurde.

Kann mir vielleicht jemand noch einen Tip geben?
Vielen Dank.

Grüße Chris
 

Neue Beiträge

Zurück