2017-03-08 15 views
0

Mes premières tentatives ont échoué mais j'espère que c'est possible. Si j'ai une classe comme celui-ci qui est COM enregistré:.net COMVisible/ComInterop - pouvez-vous utiliser un type sans l'enregistrer?

[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(); 
    } 
} 

Puis-je utiliser pour revenir Class2.Interface1 qui est ComVisible mais pas enregistré (il est dans une autre bibliothèque):

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


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

Mon les premières tentatives ont renvoyé l'erreur: IUnknown: SomeMethod (méthode non exportée), mais j'espère qu'il y aura peut-être un truc à faire que je ne sais pas.

+0

Le message d'erreur ne semble pas bon, quelque chose ne va pas avec le code client. Renvoyer * objet * d'une méthode nécessite que le client utilise "liaison tardive" via IDispatch ou un appel QueryInterface sur la variante pour le type d'interface attendu. Il ne peut jamais être inconnu. Je devinerais à une tentative imprudente de lancer, éventuellement induite en ayant deux bibliothèques de types distincts. Juste une supposition, clairement, il doit être explicitement documenté dans la question. –

Répondre

0

J'ai trouvé ceci possible si vous marquez la classe comme ComVisible (juste l'interface comme ComVisible n'était pas suffisant). Je peux maintenant utiliser ClassLibrary3 via COM. Voir ci-dessous le code:

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(); 
    } 
} 
} 

bibliothèque totalement distincte qui n'a pas été ed "Regasm":

namespace ClassLibrary3 
{ 

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