2010-04-09 4 views
0

J'ai le problème suivant: J'ai un projet en C# où j'utilise un composant COM tiers. Donc, le problème est que le composant ci-dessus a une méthode, qui prend une chaîne et un certain nombre de paires clé-valeur en tant qu'arguments. J'ai déjà réussi à appeler cette méthode via JavaScript comme ça:Passage d'une paire clé-valeur à une méthode COM à partir de .NET

var srcName 
srcName = top.cadView.addSource('Database', { driver : 'Oracle', host : '10.10.1.123', port : 1234, database : 'someSID', user : 'someuser', password : 'somepass' }) 
if (srcName != '') 
{ 
    ... 
} 

... et cela a parfaitement fonctionné. Cependant je n'ai aucune idée comment faire la même chose en utilisant C#. J'ai essayé de passer les paires comme Dictionary et Struct/Class mais cela me jette un "Specified cast n'est pas valide." exception. J'ai aussi essayé d'utiliser Hashtable comme ça:

Hashtable args = new Hashtable(); 
args.Add("driver", "Oracle"); 
args.Add("host", "10.10.1.123"); 
args.Add("port", 1234); 
args.Add("database", "someSID"); 
args.Add("user", "someUser"); 
args.Add("password", "samePass"); 

String srcName = axCVCanvas.addSource("Database", args); 

et bien qu'il ne jette pas une exception, il ne parvient toujours pas faire le travail, me écrire dans un fichier journal

[Erreur] [14 : 38: 33,281] Cad :: SourceDB :: SourceDB(): manquant paramètre 'pilote'

+0

Mmmmm accéder à une base de données à partir de javascript ... –

+0

Avez-vous une typelib décrivant l'interface COM? –

Répondre

0

Pourriez-vous passer dans une liste de chaînes délimitées? Quelque chose comme

Liste args = new List()

args.Add ("clé: valeur);

par exemple args.Add (" driver: Oracle);

+0

Je l'ai déjà essayé, does'n work - throws Cast spécifié n'est pas valide. "Exception – Sinnerman

0

Le composant ACtiveX utilise probablement les méthodes IDispatch ou IDispatchEx pour convertir le type dynamique en une liste de noms de propriétés, puis y accéder. Vous pouvez trouver un type différent à transmettre (ce qui fonctionnera également) via le fournisseur ou la documentation, ou vous devrez implémenter l'une de ces interfaces vous-même (System.Collections.Dictionary non).

Une autre chose à essayer est le type de script Dictionary (vous devrez importer la typelib correcte pour accéder à ce type).

+0

Scripting.Dictionary était une très bonne idée, je n'ai jamais pensé à cela, malheureusement pas de succès là-bas.Je vais essayer de jouer avec IDispatchEx et laisser vous savez si je pense à quelque chose, merci pour votre aide. – Sinnerman

Questions connexes