Bonjour
tous est dans le titre: peut on utiliser une DLL DotNet dans un programme en C? et si oui comment doit on faire?
Cordialement.
Bonjour
tous est dans le titre: peut on utiliser une DLL DotNet dans un programme en C? et si oui comment doit on faire?
Cordialement.
Tu peux, mais uniquement en tant que composant COM.
Ta DLL doit donc être COM-Visible, ainsi que les types que tu veux exposer (classes et interfaces) qui doivent avoir un UUID correctement défini.
Ensuite, tu dois définir les mêmes interfaces en C (ou bien, regénérer un fichier d'en-tête à partir de la Type Library, en utilisant le programme OLEVIEW.EXE livré avec Visual).
Une fois cela fait, tu pourras utiliser ta classe .Net comme simple classe COM (simplement, ça ne s'enregistre pas avec regsvr32.exe, mais avec un autre programme, il me semble que c'est regasm.exe).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pas sous la main, mais il me semble qu'il y avait un tuto ou un article quelque part sur dvp (le site, pas le forum)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Là, ce n'est pas seulement du COM Interop, c'est du COM Interop + Late Binding (utilisation de l'interface IDispatch).
Tu peux aussi bien faire ça en C qu'en C++.
Pour la peine, une traduction de ce code en C (plus quelques corrections):
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 //Exemple de COM Interop en C++ sur le bloc de nico-pyright. //Corrigé et Traduit en C le 2008-02-12 Ma pour Jayceblaster #include <windows.h> #include <stdio.h> #include <tchar.h> int _tmain(void) { CLSID clsID; CoInitialize(NULL); //Création de l'objet if (SUCCEEDED(CLSIDFromProgID(OLESTR("assembly.MaClasse"), &clsID))) { IDispatch *pDisp = NULL; if (SUCCEEDED(CoCreateInstance(&clsID, NULL, CLSCTX_ALL, &IID_IDispatch, (void**)&pDisp))) { //Appelle de la méthode Print OLECHAR *methodName = OLESTR("Print"); DISPID dispid; if (SUCCEEDED(pDisp->lpVtbl->GetIDsOfNames(pDisp, &IID_NULL, &methodName,1, GetUserDefaultLCID(), &dispid))) { DISPPARAMS param; param.cArgs=0; param.rgvarg=NULL; param.cNamedArgs=0; param.rgdispidNamedArgs=NULL; if (SUCCEEDED(pDisp->lpVtbl->Invoke(pDisp, dispid, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, ¶m, NULL, NULL, NULL))) { _putts("OK!"); } } pDisp->lpVtbl->Release(pDisp), pDisp=NULL; } } CoUninitialize(); return 0; }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
j'ai fait un CoInitialize dans mon programme en C++ mais c'est pas reconnu pourquoi? (desolé je suis pas un crac en C++![]()
Partager