2010-05-01 6 views
6

.NET COM Interop ist bisher immer ziemlich gut funktioniert. Seit ich auf Windows 7 aktualisiert habe, bekomme ich meine .NET COM-Objekte nicht mehr zum Laufen..NET COM Interop unter Windows 7 64Bit gibt mir Kopfschmerzen

Mein COM-Objekt ist so einfach wie:


namespace Crap 
{ 
    [ComVisible(true)] 
    [Guid("2134685b-6e22-49ef-a046-74e187ed0d21")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class MyClass : IMyClass 
    { 

     public MyClass() 
     {} 

     public void Test() 
     { 
      MessageBox.Show("Finally got in here."); 
     } 

    } 
} 



namespace Crap 
{ 
    [Guid("1234685b-6e22-49ef-a046-74e187ed0d21")] 
    public interface IMyClass 
    { 

    } 
} 

 

Montage ComVisible auch markiert.

I registrieren die Baugruppe

regasm /codebase /tlb "path"

Register erfolgreich (Admin-Modus). Ich habe versucht, regasm 32 und 64bit. Sowohl Zeit erhalte ich die Fehler

„ActiveX-Komponente kann nicht Objekt Crap.MyClass erstellen“ mit diesem Vbscript:


dim objReg 
Set objReg = CreateObject("Crap.MyClass") 
MsgBox typename(objReg) 
 

fuslogvw gibt mir keine Hinweise entweder. Dieses COM-Objekt funktioniert perfekt auf meinem Vista 32 Bit-Rechner.

Ich verstehe nicht, warum ich keine Lösung für dieses Problem googlen konnte ... bin ich wirklich die einzige Person, die jemals in dieses Problem geriet?

Mit Blick auf OleView sehe ich mein Objekt erfolgreich registriert. Ich bin in der Lage, andere COM-Objekte zu erstellen .. es funktioniert nur nicht mit meinen eigenen.

Danke, Kevin

+0

Könnten Sie diesen Thread bitte als beantwortet markieren? Danke :) –

Antwort

2

registriert Ich bin kein C# Person, aber hier ist ein Beispiel, das ich von VB.net umgewandelt. Beachten Sie, dass ich sicherstellen musste, dass ich einen einzelnen Namespace auf Projektebene und dann diese Klasse in VB-Projekten hatte. Ich verstehe, dass das in C# -Projekten anders ist.

[ComClass(MyClass.ClassId, MyClass.InterfaceId, MyClass.EventsId)] 
public class MyClass { 

    // These GUIDs provide the COM identity for this class 
    // and its COM interfaces. If you change them, existing 
    // clients will no longer be able to access the class. 
    public const string ClassId = "f58411e1-1689-4bf3-a0e1-b49f479e28ba"; 
    public const string InterfaceId = "f4a575c6-62d2-44eb-af0f-f5b2bb65ad51"; 
    public const string EventsId = "ad56e4f9-3512-4233-aae4-7d1c2457c08f"; 

    // A creatable COM class must have a Public Sub New() 
    // with no parameters, otherwise, the class will not be 
    // registered in the COM registry and cannot be created 
    // via CreateObject. 
    public SalePayStatus() : base() 
    { 
    } 
} 

Wenn ich über COM besorgt bin, habe ich immer in der Registrierung überprüfen Sie zuerst die entsprechenden Einträge, um sicherzustellen, erstellt wurden. Ich habe festgestellt, dass Versionierung und MSI-Installation Probleme verursachen, insbesondere Deinstallation (nicht die Registrierung bereinigen) oder neu installiert und MSI mit .net COM-Objekte, die einen vorhandenen COM-Eintrag überschreibt alle Arten von Problemen verursacht.

Ich finde im Allgemeinen, dass Sie über x64 vs. x32 Build .net DLLs vorsichtig sein müssen.Zum Beispiel müssen Sie möglicherweise explizit auf C: \ Windows \ SysWow64 \ oder C: \ Windows \ System32 \ Editionen der VBS-Engine verweisen.

Schließlich, wenn Sie VBS in einer ASP-Website auf einem x64-Server mit einer x32 COM .net-Komponente verwenden, dann müssen Sie die erweiterte Option IIS 7 Application Pool sicherstellen Ist die 32-Bit-Anwendung richtig True/False gesetzt.

1

Dank! Wusste nicht, dass es 2 Register gab, auf die ich aufpassen muss. War ungefähr Zeit, zu Win7 64 Bit zu wechseln, denke ich :)

Danke.

Für alle anderen, die in das gleiche Problem lautet: wscript (der Client, vbs-Dateien in der Regel ausführt) ausgeführt wird in 64-Bit-Modus => RegAsm 64bit ist

Andere gängige Clients wie Excel ausgeführt, in verwendet werden 32bit mode => RegAsm 32bit ist zu verwenden.

Visual Studio wird in 32-Bit ausgeführt => Register für COM-Interop registriert nur das COM-Objekt in 32-Bit-Registrierung.

Das einzige, was ich jetzt herausfinden, ist wie Sie sicherstellen, dass VS-Setup beide Versionen

+1

Klingt wie dieser Thread beantwortet wird, bitte markieren Sie die Antwort, die Ihnen am meisten geholfen hat. –

+0

Dies sollte eine (Reihe von) Kommentar (e) sein ... oder eine Bearbeitung des ursprünglichen Posts. –