none
RegAsm registriert halbe exe... RRS feed

  • Frage

  • Hi,

    ich habe heute mit RegAsm meine exe in der Registry registriert, hab ich auch nachgeprüft.

    meine exe besteht aus der Program.cs, einer Winform, und einer Class

    nach der Registrierung ist lediglich die Winform in der Registry zu finden die eigentliche Class die ich hauptsächlich wollte ist nicht registriert worden...

     

    wie kann ich das beheben?

    Mittwoch, 21. Dezember 2011 15:39

Antworten

  • Das sollte dir eigentlich weiter helfen (Ist VB.NET):

     

    <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
    Public Class ComClass1
    
    #Region "COM-GUIDs"
        ' Diese GUIDs stellen die COM-Identität für diese Klasse
        ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
        ' Clients nicht mehr auf die Klasse zugreifen.
        Public Const ClassId As String = "1602b4a9-4d12-4b11-9001-3dacc7485b25"
        Public Const InterfaceId As String = "3da222cb-f0b8-4fab-8937-2172d392bc5c"
        Public Const EventsId As String = "4738843e-37ce-41c8-96d5-fb9d1ed5c3dc"
    #End Region
    
        ' Eine erstellbare COM-Klasse muss eine Public Sub New()
        ' ohne Parameter aufweisen. Andernfalls wird die Klasse
        ' nicht in der COM-Registrierung registriert und kann nicht
        ' über CreateObject erstellt werden.
        Public Sub New()
            MyBase.New()
        End Sub
    
    End Class
    

    • Als Antwort markiert Schnisel Freitag, 23. Dezember 2011 08:02
    Donnerstag, 22. Dezember 2011 17:34
  • Hallo,

    .NET liefert Dir einen Proxy zurück.

    Willst Du den "richtigen" Typen ermitteln, siehe:
    http://fernandof.wordpress.com/2008/02/05/how-to-check-the-type-of-a-com-object-system__comobject-with-visual-c-net/

    Gruß Elmar

    Dienstag, 3. Januar 2012 09:53
    Beantworter
  • Es ist vollbracht xD

    ich habe das Problem lösen können...

    die Com wurde richtig registriert, als x86.

    meine TestAnwendung war als x64 compiliert, was ich erst nicht wusste, aber beim ändern auf x86 lief das Programm nicht mehr, es ließ sich einfach nicht starten...

    als ich dann zum test auf Release stellte unter x86 ging es auf einmal, besser noch er hat sogar die Com richtig gefunden und benutzen können, ka warum das unter x86 Debug nicht gestartet hat...

     

    Großen dank an alle die geholfen haben!

    lg Schnisel

    Donnerstag, 5. Januar 2012 11:12

Alle Antworten

  • Hi,

    was genau wurde wie registriert (genauer Aufruf der RegAsm) und was genau steht nun in der Registry?

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 21. Dezember 2011 16:09
    Moderator
  • REGEDIT4
    
    [HKEY_CLASSES_ROOT\PRC.LoadingForm]
    @="PRC.LoadingForm"
    
    [HKEY_CLASSES_ROOT\PRC.LoadingForm\CLSID]
    @="{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}"
    
    [HKEY_CLASSES_ROOT\CLSID\{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}]
    @="PRC.LoadingForm"
    
    [HKEY_CLASSES_ROOT\CLSID\{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}\InprocServer32]
    @="mscoree.dll"
    "ThreadingModel"="Both"
    "Class"="PRC.LoadingForm"
    "Assembly"="PRC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d40cb50ce6f1401d"
    "RuntimeVersion"="v4.0.30319"
    
    [HKEY_CLASSES_ROOT\CLSID\{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}\InprocServer32\6.0.0.0]
    "Class"="PRC.LoadingForm"
    "Assembly"="PRC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d40cb50ce6f1401d"
    "RuntimeVersion"="v4.0.30319"
    
    [HKEY_CLASSES_ROOT\CLSID\{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}\ProgId]
    @="PRC.LoadingForm"
    
    [HKEY_CLASSES_ROOT\CLSID\{3DAE4A70-7CB7-35CF-8F32-E9E4B3CFFCEE}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]
    
    

    das ist der Inhalt der Reg Datei, die mir erstellt wird.

    in PRC befindet sich aber noch die Programm.cs und meine Class.cs die ich eigentlich registriert haben möchte.

    Der Aufruf:

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe PRC.exe /regfile
    


    Donnerstag, 22. Dezember 2011 07:24
  • Hallo Schnisel,

     

    eine EXE braucht nicht registriert zu werden.

     

    Ich denk mal es geht darum Programm.cs und Class.cs zu registrieren.

    Wenn die Klassen im selben Projekt wie deine LodingForm werden sie beim Kompelieren mit ins gleiche Assembly (.dll bzw hier .exe) gepackt und brauchen nicht registriert zu werden.

    Wenn du für die Klassen eigene Projekte hast must du sie kompielieren und bekommst dann eine .dll die du dann registrieren kannst.

     

    MFG

    Björn

     

     

    Donnerstag, 22. Dezember 2011 08:22
  • hab ich schon probiert, ich möchte auf die Class.cs ja von außen per:

     

    typ = Type.GetTypeFromProgID("PRC.Class");
    Activator.CreateInstance(typ);
    

     


    zugreifen, allerdings findet er die nicht weil nur die LoadingForm in der Registry vorhanden ist.

    als dll gehts nicht weil die Class auf die Program.cs zugreift und als exe benötigt wird um wieder ein Anderes Proggi mit args[] aufzurufen, aber darum gehts grad net xD

    Also ich denke schon das die registriert werden muss, da ich Class.cs sonst nicht finde...


    • Bearbeitet Schnisel Donnerstag, 22. Dezember 2011 08:54
    Donnerstag, 22. Dezember 2011 08:54
  • Wenn du auf eine Klasse aus Verschiedenen Programmen zugreifen möchtest.

    Bietet es sich an aus ihr eine eigene .dll zu machen, über Verweis hinzufügen kannst du dann aus den anderen Programmen auf die Klasse zugreifen.

     

    Donnerstag, 22. Dezember 2011 09:03
  • aber in diesem fall nicht da ich die Class.cs aufrufe die den aufruf verarbeitet und an die Program.cs weiterleitet und dann ein anderes Programm von dort startet

    die Program.cs wird auch als exe verwendet um sie mit args[] aufzurufen, sonst würde ich sie als dll machen um sie als verweis zu nutzen, das reicht aber in diesem fall nicht.

    Donnerstag, 22. Dezember 2011 09:31
  • Nun erstmal man Registriert eine Assambly (dll) um sie COM sichtbar zu machen, so das ich sie zB mit VB6 nutzen kann.

    So wie es schein willst du kein VB6 benutzen.

     

    Eine EXE wird nicht registriert!

     

    Wenn ich dich richtig verstanden habe hast du Klassen, die du einmal von anderen Klassen aus benutzen möchtest und zusätlich als EXE ausführen möchtest.

    Hier kannst du hingehen eine Class.dll erstellen und eine RunClass.exe die auf deine Class.dll Verweist.

    Das gleiche kannst du  mit Program machen. Du hast dann jetzt Program.dll und RunProgram.exe

    Jetzt kann deine Class auf die Program.dll Verweisen.

     

    Zur  Type.GetFromProgID mal ein auszug ausw der MSDN

    "Diese Methode wird für die COM-Unterstützung bereitgestellt. ProgIDs werden in Microsoft .NET Framework nicht verwendet, da diese durch das Namespacekonzept ersetzt wurden."

     


     


    Donnerstag, 22. Dezember 2011 11:02
  • ich will auch von einem Word Dokument auf die Class.cs zugreifen.

    aber wenn man eine exe nicht registrieren kann/muss warum wird dann die LoadingForm registriert?

    und warum nur die?

    Donnerstag, 22. Dezember 2011 11:05
  • Ich muss gestehen das ich noch auf keine externe Klasse von Word aus zugegriffen habe und mich da erst einlesen müste. Hier kann ich dir also nicht direkt weiterhelfen.

     

    Es kann aberdurchaus sein, das die Klasse COM sichtbar sein muss um in Word benutzt werden zu können.

    Hier mal einen Link was du machen must um eine Klasse COM-Sichtbar zu machen.

     

     

    Donnerstag, 22. Dezember 2011 12:06
  • das ist ja gerade das problem...

    ich habe die Com sichbar gemacht... naja versucht.

    ich habe der Class.cs eine gültige GUID verpasst, sie ComVisible=true gesetzt, und mit RegAsm registriert, aber anstatt die ganze PRC.exe oder alle Klassen einzeln daraus zu registrieren hat er nur eine der Klassen registriert, die LoadingForm.

    ich weiß nicht ob er da was fehlerhaft registriert oder ob ich da einfach zu doof für war...

    Donnerstag, 22. Dezember 2011 12:48
  • ok da kommen wir der Sache schon näher.

     

    Probier mal beim hinzufügen einer neuen Klasse zu deinem Projekt, COM-Klasse auszuwählen.

    Das Studio erzteugt dir dann die nötigen einträge in dem Klassen Rumpf.

     

    Oder Poste mal den Code der Klasse.

    Donnerstag, 22. Dezember 2011 14:02
  • ich kann bei mir keine COM-Klasse auswählen...

    hab Visual Studio 2010 Prof

    wo könnte ich so eine klasse finden?

    Donnerstag, 22. Dezember 2011 14:26
  • Das sollte dir eigentlich weiter helfen (Ist VB.NET):

     

    <ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
    Public Class ComClass1
    
    #Region "COM-GUIDs"
        ' Diese GUIDs stellen die COM-Identität für diese Klasse
        ' und ihre COM-Schnittstellen bereit. Wenn Sie sie ändern, können vorhandene
        ' Clients nicht mehr auf die Klasse zugreifen.
        Public Const ClassId As String = "1602b4a9-4d12-4b11-9001-3dacc7485b25"
        Public Const InterfaceId As String = "3da222cb-f0b8-4fab-8937-2172d392bc5c"
        Public Const EventsId As String = "4738843e-37ce-41c8-96d5-fb9d1ed5c3dc"
    #End Region
    
        ' Eine erstellbare COM-Klasse muss eine Public Sub New()
        ' ohne Parameter aufweisen. Andernfalls wird die Klasse
        ' nicht in der COM-Registrierung registriert und kann nicht
        ' über CreateObject erstellt werden.
        Public Sub New()
            MyBase.New()
        End Sub
    
    End Class
    

    • Als Antwort markiert Schnisel Freitag, 23. Dezember 2011 08:02
    Donnerstag, 22. Dezember 2011 17:34
  • Könnte es daran liegen das die Class.cs als static deklariert ist?

     

    //Edit

    Es lag am static -.- sag mir doch einer das statische Klassen nicht ComVisible sein können xD

    Ich danke für die Antworten und die Ausdauer mit mir =D

     

    lg und ein frohes Fest

    • Bearbeitet Schnisel Freitag, 23. Dezember 2011 08:01
    Freitag, 23. Dezember 2011 07:34
  • Hallo,

    daran könnte es u. a. liegen, statische Typen und Methoden können in COM nicht verwendet werden.

    Siehe Qualifizieren von .NET-Typen für die Interoperation (und ff.)

    Wenn es immer noch nicht klappt, wäre es hilfreich, wenn Du Deine "Klasse"
    auszugsweise posten würdest, denn hier wird nur geraten.

    Gruß Elmar

    Freitag, 23. Dezember 2011 08:08
    Beantworter
  • Ich hoffe alle hatten ein Frohes Fest und sind gut gerutscht.

    Nach meinem erholsamen Urlaub habe ich mich wieder an die Arbeit gemacht ;)

    meine Klasse habe ich komplett überarbeitet, statics entfernt und alle Methoden öffentlich gemacht.

    Mittlerweile wird sie von RegAsm wunderschön registriert, allerdings wenn ich eine Instanz mit

    ComDll = Type.GetTypeFromProgID("PRC.Class");
    

    erstelle gibt er mir folgende Assembly zurück:

    System.__ComObject, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

    woran könnte das liegen? bzw was kann ich ändern?

     

    Auszüge aus der Klasse:

    [ComVisible(true)]
    [Guid("A287CF4E-194E-43e5-8AAA-3422E6913FBE")]
    public class Class
    {
       ....
       [Private Klassenvariablen]
       [öffentliche Variablen]
       ....
       [Standard Konstruktor]
       ....
       [2 öffentliche Methoden]
    }
    


    Dienstag, 3. Januar 2012 09:21
  • Hallo,

    .NET liefert Dir einen Proxy zurück.

    Willst Du den "richtigen" Typen ermitteln, siehe:
    http://fernandof.wordpress.com/2008/02/05/how-to-check-the-type-of-a-com-object-system__comobject-with-visual-c-net/

    Gruß Elmar

    Dienstag, 3. Januar 2012 09:53
    Beantworter
  • Es ist vollbracht xD

    ich habe das Problem lösen können...

    die Com wurde richtig registriert, als x86.

    meine TestAnwendung war als x64 compiliert, was ich erst nicht wusste, aber beim ändern auf x86 lief das Programm nicht mehr, es ließ sich einfach nicht starten...

    als ich dann zum test auf Release stellte unter x86 ging es auf einmal, besser noch er hat sogar die Com richtig gefunden und benutzen können, ka warum das unter x86 Debug nicht gestartet hat...

     

    Großen dank an alle die geholfen haben!

    lg Schnisel

    Donnerstag, 5. Januar 2012 11:12