2017-03-08 4 views
0

Meine ersten Versuche sind fehlgeschlagen, aber ich hoffe, dass es möglich ist. Wenn ich eine Klasse wie diese haben, die COM registriert ist:.net COMVisible/ComInterop - können Sie einen Typ verwenden, ohne ihn zu registrieren?

[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("53DB4409-0827-471D-94CE-2601D691D04C")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return (ClassLibrary2.Interface1) new ClassLibrary2.Class1(); 
    } 
} 

Kann ich damit Class2.Interface1 zurückzukehren, die ComVisible ist aber nicht registriert (es ist in einer anderen Bibliothek):

[ComVisible(true)] 
public interface Interface1 
{ 
    string SomeMethod(); 
} 


public class Class1:Interface1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("SomeMethod"); 
     return "SomeMethod"; 
    } 
} 

Meine Die ersten Versuche haben den Fehler zurückgegeben: IUnknown: SomeMethod (Keine exportierte Methode), aber ich hoffe, dass es einen Trick gibt, den ich nicht kenne.

+0

Die Fehlermeldung sieht nicht gut aus, ist etwas falsch mit dem Client-Code. Wenn * Objekt * von einer Methode zurückgegeben wird, muss der Client eine "späte Bindung" über IDispatch oder einen QueryInterface-Aufruf für die Variante des erwarteten Schnittstellentyps verwenden. Es kann niemals IUnknown sein. Ich würde einen unklugen Castingversuch wagen, der möglicherweise durch zwei verschiedene Typbibliotheken ausgelöst wird. Nur eine Vermutung, klar muss es explizit in der Frage dokumentiert werden. –

Antwort

0

Ich fand dies möglich, wenn Sie die Klasse als ComVisible markieren (nur die Schnittstelle als ComVisible war nicht genug). Ich kann jetzt ClassLibrary3 über COM verwenden. Im folgenden sehen Sie den Code ein:

namespace ClassLibrary1 
{ 
[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver2")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("83720331-12CB-48E1-947C-2413F7B9AB89")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return new ClassLibrary3.Class1(); 
    } 
} 
} 

Völlig separate Bibliothek, die nicht "Regasm" ed war:

namespace ClassLibrary3 
{ 

[ComVisible(true)] 
public class Class1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("ClassLibrary3.Class1.SomeMethod...."); 
     return "ClassLibrary3.Class1.SomeMethod"; 
    } 
} 
} 
Verwandte Themen