bonjour,
Je souhaiterai savoir comment inclure une bibliothèque de classe CLR dans une application Windows Form de façon dynamique et non statique.:
Merci d'avance
bonjour,
Je souhaiterai savoir comment inclure une bibliothèque de classe CLR dans une application Windows Form de façon dynamique et non statique.:
Merci d'avance
regarde du coté de loadassembly
J'ai trouvé effectivement un début de solution avec les assembly.
Voici le code généré par mes 3 fichiers:
DLL2.h
namespace DLL2
{
class ClassFonction
{
public:
static double Add(double a, double b);
};
}
DLL2.cpp
#include "DLL2.h"
namespace DLL2
{
double ClassFonction::Add(double a, double b)
{
return a + b;
}
}
dans le fichier exécutable:
System::Reflection::Assembly^ ExempleAssembly;
ExempleAssembly=System::Reflection::Assembly::LoadFrom("DLL2.dll");
mais, je ne sais pas comment utiliser la fonction Add(...) dans mon exécutable ?
Comment poursuivre ?
ben il faut typer avec ClassFonction
Bonjour,
Voici mon code :
System::Reflection::Assembly^ ExempleAssembly;
ExempleAssembly=System::Reflection::Assembly::LoadFrom("DLL2.dll");
Type^ t=ExempleAssembly->GetType();
Object^ Objet=ExempleAssembly->CreateInstance("DLL2.ClassFonction");
-> label2->Text=Convert::ToString(((DLL2::ClassFonction)Objet)->Add(1,2));
J'ai des erreurs de code sur la dernière ligne car je n'arrive pas à utiliser la fonction Add:
Erreur 1 error C2440: 'cast de type'*: impossible de convertir de 'System::Object ^' en 'DLL2::ClassFonction' Form1.h 126
Erreur 2 error C2819: le type 'DLL2::ClassFonction' n'a pas d'opérateur 'operator ->' de membre surchargé Form1.h 126
Erreur 3 error C2232: '->DLL2::ClassFonction::Add'*: opérande gauche avec type 'class', utilisez '.' Form1.h 126
A priori, je ne sais pas correctement utiliser le transtypage, mais je ne sais par comment modifier mon code ?
ah oui ok, ben en fait, il faut que tu fasses une classe managée publique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public ref class ClassFonction { ... };
Merci nyco-pyright.
voici la modification qui fonctionne correctement:
DLL.h
#pragma once
using namespace System;
namespace DLL {
public ref class ClassTest
{
public:
static double Add(double a, double b);
};
}
DLL.cpp
#include "stdafx.h"
#include "DLL.h"
namespace DLL {
double ClassTest::Add(double a, double b)
{
return a + b;
}
}
Dans l'exécutable:
1 System::Reflection::Assembly^ ExempleAssembly=System::Reflection::Assembly::LoadFrom("DLL.dll");
2 array<Type^>^ T=ExempleAssembly->GetTypes();
3 Object^ Objet=ExempleAssembly->CreateInstance("DLL::ClassTest");
4 cli::array<Object^>^ argument=gcnew cli::array<Object^>(2);
5 argument[0]=(double)1;
6 argument[1]=(double)2;
7 double Valeur=(double)(T[0]->InvokeMember("Add",
System::Reflection::BindingFlags::InvokeMethod|
System::Reflection::BindingFlags:ublic|
System::Reflection::BindingFlags::Static,
nullptr,nullptr,argument));
Je reste toutefois un peux insatisfait, car, je n'est pas réussi a utiliser le code suivant dans mon l'exécutable:
ligne 2 "Type^ t=ExempleAssemply->GetType();
ligne 7 double Valeur=(double)(t->InvokeMember("Add",
System::Reflection::BindingFlags::InvokeMethod|
System::Reflection::BindingFlags:ublic|
System::Reflection::BindingFlags::Static,
nullptr,nullptr,argument));
en effet, la ligne 7 me renvoyant une exception lors de l'exécution du programme:
-> Méthode 'System.Reflection.Assembly.Add' introuvable.
Je ne comprends pas, puisque GetType() est le plus souvent utiliser par beaucoup ?
Comment faire pour utiliser la fonction GetType() correctement à la place de GetTypes() ?
Utilise exempleAssembly->GetType("DLL::ClassTest") et non exempleAssembly->GetType().
Avec le premier, tu as bien le type de DLL::ClassTest, avec le second, tu te retrouves avec le type de System::Assembly (la méthode GetType() héritée de System::Object)...
PS: Par convention, tes variables locales devraient commencer par une minuscule.
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.
Bonjour,
Merci pour ces précisions.
Il me reste encore une interrogation aprés cette discussion: faut-il créer un autre domaine d'application lors l'on utilise un Assembly au lieu de placer l'assembly dans le domaine d'application initial?
En effet, ce code fonctionne, mais il me semble qu'il n'est pas forcéement sécurisé aprés la lecture des tutoriaux (?)
Si c'est le cas, comment ajoute-on un nouveau domaine d'application ?
Merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager