2009-08-14 10 views
0

Il semble que vous ne pouvez pas utiliser les types génériques directement avec COM: voir Interoperating Using Generic Types sur MSDN.COM Interop utilisant des types génériques

Quelqu'un peut-il donner un exemple de la façon dont cela pourrait être réalisé?

+0

Pouvez-vous élaborer? Vous dites que cela ne peut pas être fait alors demandez comment cela peut être fait. Avez-vous un scénario spécifique? –

+0

L'article référencé dit 'directlty', donc je suppose qu'il y a un moyen de les utiliser 'indirectement'. L'exemple spécifique est celui-ci: http://stackoverflow.com/questions/1200576/find-all-controls-on-msform-from-c – jedd

+0

Juste pour ajouter plus d'informations, VB.NET doit faire le 'quelque chose d'indirect' comme le code réfréné fonctionne. Si j'ai mal orthographié la collection Contrôles, j'obtiens l'erreur: System.MissingMemberException 's'est produite dans Microsoft.VisualBasic.dll Donc, j'ai besoin de savoir quel est le quelque chose qui manque, pour que le code fonctionne dans C#! – jedd

Répondre

4

Je pense que l'idée est que vous ne pouvez pas marquer un type générique comme ComVisible directement, mais vous pouvez avoir ce type implémenter des interfaces non génériques qui sont ComVisible.

Ainsi, étant donné un Baker<Recipe> générique, vous devez présenter quelque chose comme:

[ComVisible(true)] 
public interface IBake 
{ 
    Pastry Bake(); 
} 

public class Baker<Recipe> : IBake 
{ 
    public Baker(Recipe ingredients) {...} 

    public Pastry Bake() 
    { 
     ... 
    } 
} 

[ComVisible(true)] 
public class Bakery 
{ 
    public IBake GetBaker(string recipe) 
    { 
     // somehow get recipe type from string 
     // and create and return Baker<Recipe> 
     // Client can now call IBake.Bake(). 
    } 
} 

Je suppose que c'est le « indirectement » que l'article parle. Je ne vois pas ce que la collection Controls de VB.NET a à faire avec ça, cependant ...

+0

Je pense que c'est en fait un bug (je ne sais pas si c'est avec .net framework ou COM Interop lors de l'utilisation de types génériques.) Pour expliquer (en utilisant vb.net): Si j'autorise VB.NET à fonctionner sur quel type d'objet le concepteur 'générique' l'objecte, il fonctionne correctement c'est un userform (je le sais en retournant le type: Microsoft.VisualBasic.Information.TypeName) .Si j'ai expicitement défini l'objet générique en tant que Userform, Je reçois une erreur (dans n'importe quel langage .NET): {"Le serveur a émis une exception. (Exception de HRESULT: 0x80010105 (RPC_E_SERVERFAULT))"} – jedd

+0

Vous m'avez perdu là-bas, j'ai bien peur ... –

Questions connexes