OVH Cloud OVH Cloud

[DLL] Bibliothèque de classes + service de composants ?

7 réponses
Avatar
Loupinet
Bonjour à tous !

Je suis depuis quelques jours sur un problème pour lequel je ne trouve
pas de solution qui pourtant, j'en suis sur, en plus qu'évidente :o))

Je cherche à créer une DLL appeler la maigre classe qu'elle contient via
une page web ASP. Habitué de ce genre de manipulation avec VB6 je suis
mis en déroute avec VB.NET.

Pour pouvoir instancier l'objet de la DLL via une page ASP, je fais
comme d'habitude : inscrire celle-ci dans le service de composants du
serveur web. Or ce dernier me renvoi le message comme quoi mon fichier
"ne contient pas de composant ou de bibliothèque de types". L'exécutable
regsrv.exe ne trouve pas non plus de point d'entrée.

Ma bibliothèque de classe contient un module de classe structuré de la
sorte :

**************************************
Imports ...

Public Class MaClasse

'-- Partie ajoutée suites recherches,
'-- n'a aucun effet sur mon problème
Inherits System.ComponentModel.Component

'-- Définitions de types + déclaration variables
Dim MaVariable as String

'-- Constructeur
Public Sub New(ByVal MaValeur as string)
Me.MaVariable = MaValeur
End Sub

'-- Méthodes
Function MaFonction() As Boolean
...
End Function

End Class
**************************************

J'ai tenté la compilation normal + "Inscrire pour COM Interop" mais rien
y fait, impossible d'inscrire la DLL dans le service de composants !


Help !

Loupinet, en galère...

7 réponses

Avatar
Loupinet
Je viens de découvrir qu'on peut "ajouter une classe" en tant que
"Classe COM" ou "Composant transactionnel"... j'y est cru, mais le
problème persiste :'-(((


Moi même a écrit :
Bonjour à tous !

Je suis depuis quelques jours sur un problème pour lequel je ne trouve
pas de solution qui pourtant, j'en suis sur, en plus qu'évidente :o))

Je cherche à créer une DLL appeler la maigre classe qu'elle contient via
une page web ASP. Habitué de ce genre de manipulation avec VB6 je suis
mis en déroute avec VB.NET.

Pour pouvoir instancier l'objet de la DLL via une page ASP, je fais
comme d'habitude : inscrire celle-ci dans le service de composants du
serveur web. Or ce dernier me renvoi le message comme quoi mon fichier
"ne contient pas de composant ou de bibliothèque de types". L'exécutable
regsrv.exe ne trouve pas non plus de point d'entrée.

Ma bibliothèque de classe contient un module de classe structuré de la
sorte :

**************************************
Imports ...

Public Class MaClasse

'-- Partie ajoutée suites recherches,
'-- n'a aucun effet sur mon problème
Inherits System.ComponentModel.Component

'-- Définitions de types + déclaration variables
Dim MaVariable as String

'-- Constructeur
Public Sub New(ByVal MaValeur as string)
Me.MaVariable = MaValeur
End Sub

'-- Méthodes
Function MaFonction() As Boolean
...
End Function

End Class
**************************************

J'ai tenté la compilation normal + "Inscrire pour COM Interop" mais rien
y fait, impossible d'inscrire la DLL dans le service de composants !


Help !

Loupinet, en galère...


Avatar
Loupinet
Personne n'a d'idée ?

Loupinet a écrit :

Je viens de découvrir qu'on peut "ajouter une classe" en tant que
"Classe COM" ou "Composant transactionnel"... j'y est cru, mais le
problème persiste :'-(((


Moi même a écrit :

Bonjour à tous !

Je suis depuis quelques jours sur un problème pour lequel je ne trouve
pas de solution qui pourtant, j'en suis sur, en plus qu'évidente :o))

Je cherche à créer une DLL appeler la maigre classe qu'elle contient
via une page web ASP. Habitué de ce genre de manipulation avec VB6 je
suis mis en déroute avec VB.NET.

Pour pouvoir instancier l'objet de la DLL via une page ASP, je fais
comme d'habitude : inscrire celle-ci dans le service de composants du
serveur web. Or ce dernier me renvoi le message comme quoi mon fichier
"ne contient pas de composant ou de bibliothèque de types".
L'exécutable regsrv.exe ne trouve pas non plus de point d'entrée.

Ma bibliothèque de classe contient un module de classe structuré de la
sorte :

**************************************
Imports ...

Public Class MaClasse

'-- Partie ajoutée suites recherches,
'-- n'a aucun effet sur mon problème
Inherits System.ComponentModel.Component

'-- Définitions de types + déclaration variables
Dim MaVariable as String
'-- Constructeur
Public Sub New(ByVal MaValeur as string)
Me.MaVariable = MaValeur
End Sub

'-- Méthodes
Function MaFonction() As Boolean
...
End Function

End Class
**************************************

J'ai tenté la compilation normal + "Inscrire pour COM Interop" mais
rien y fait, impossible d'inscrire la DLL dans le service de composants !


Help !

Loupinet, en galère...




Avatar
Fabien Bezagu
Loupinet,

Il y a visiblement une incohérence dans ce que tu dis : tu cherches à créer
une DLL (donc on peut supposer que tu pars de rien) et tu parles
d'interopérabilité COM. .NET n'est pas COM et les assemblages .NET compilés
en DLL ne sont pas enregistrables comme l'étaient les DLL ActiveX/COM. Je
pense que c'est de là que vient ton problème puisque tu dis que regsvr32 ne
fonctionne pas...et c'est logique.

Si ta DLL est effectivement un assemblage .NET, alors rien de plus simple :
il faut ajouter la référence à ton projet Web et faire, si besoin, un import
du namespace.

Reviens nous dire si j'ai bien compris ton problème...

Fabien

"Loupinet" a écrit dans le message de news:
431c16a2$0$19428$
Personne n'a d'idée ?

Loupinet a écrit :

Je viens de découvrir qu'on peut "ajouter une classe" en tant que "Classe
COM" ou "Composant transactionnel"... j'y est cru, mais le problème
persiste :'-(((


Moi même a écrit :

Bonjour à tous !

Je suis depuis quelques jours sur un problème pour lequel je ne trouve
pas de solution qui pourtant, j'en suis sur, en plus qu'évidente :o))

Je cherche à créer une DLL appeler la maigre classe qu'elle contient via
une page web ASP. Habitué de ce genre de manipulation avec VB6 je suis
mis en déroute avec VB.NET.

Pour pouvoir instancier l'objet de la DLL via une page ASP, je fais
comme d'habitude : inscrire celle-ci dans le service de composants du
serveur web. Or ce dernier me renvoi le message comme quoi mon fichier
"ne contient pas de composant ou de bibliothèque de types". L'exécutable
regsrv.exe ne trouve pas non plus de point d'entrée.

Ma bibliothèque de classe contient un module de classe structuré de la
sorte :

**************************************
Imports ...

Public Class MaClasse

'-- Partie ajoutée suites recherches,
'-- n'a aucun effet sur mon problème
Inherits System.ComponentModel.Component

'-- Définitions de types + déclaration variables
Dim MaVariable as String
'-- Constructeur
Public Sub New(ByVal MaValeur as string)
Me.MaVariable = MaValeur
End Sub

'-- Méthodes
Function MaFonction() As Boolean
...
End Function

End Class
**************************************

J'ai tenté la compilation normal + "Inscrire pour COM Interop" mais rien
y fait, impossible d'inscrire la DLL dans le service de composants !


Help !

Loupinet, en galère...






Avatar
Loupinet
Ok, je crois que je vais revenir en arrière dans mon problème pour que
vous compreniez mieux ce que je cherche à faire (j'aurais du commencer
par ça :o))

J'essaye de mettre à jour une vieille application web, c'est à dire :

1 site en ASP (VBScript).
1 DLL créée avec VB6 en tant qu'ActiveX/COM inscrite dans le service de
composants Windows Server.
(Le script ASP fait appel à ce composant COM via "Server.CreateObject")

J'entrepends donc de profiter des possibilités offertes par .NET via
Visual Studio .NET (avec quoi je débute) pour mettre à jour la DLL et la
rendre plus performante.

Je fais donc ma petite classe que je teste d'abord en application, tente
de la passer en DLL ensuite pour espérer l'appeler de la même manière
(Server.CreateObject) avec l'ASP.

Si je comprends bien ce que vous me dites... il serait préférable de
mettre à jour mon appli ASP vers un projet web .NET (ASPX) pour utiliser
correctement (et facilement) cette DLL ?

Avez-vous une adresse qui explique clairement et simplement tout le
mic-mac des assemblys, namespaces... etc ?

Merci pour votre aide ;-)

Benjamin

Fabien Bezagu a écrit :
Loupinet,

Il y a visiblement une incohérence dans ce que tu dis : tu cherches à créer
une DLL (donc on peut supposer que tu pars de rien) et tu parles
d'interopérabilité COM. .NET n'est pas COM et les assemblages .NET compilés
en DLL ne sont pas enregistrables comme l'étaient les DLL ActiveX/COM. Je
pense que c'est de là que vient ton problème puisque tu dis que regsvr32 ne
fonctionne pas...et c'est logique.

Si ta DLL est effectivement un assemblage .NET, alors rien de plus simple :
il faut ajouter la référence à ton projet Web et faire, si besoin, un import
du namespace.

Reviens nous dire si j'ai bien compris ton problème...

Fabien


Avatar
Fabien Bezagu
> J'essaye de mettre à jour une vieille application web, c'est à dire :

1 site en ASP (VBScript).
1 DLL créée avec VB6 en tant qu'ActiveX/COM inscrite dans le service de
composants Windows Server.
(Le script ASP fait appel à ce composant COM via "Server.CreateObject")



Je n'avais effectivement pas compris tout cela. Maintenant, c'est clair.

J'entrepends donc de profiter des possibilités offertes par .NET via
Visual Studio .NET (avec quoi je débute) pour mettre à jour la DLL et la
rendre plus performante.



Il s'agira alors certainement plus d'une refonte de la DLL que d'une simple
mise à jour. La différence est de taille puisque les deux technologies sont
très différentes.

Je fais donc ma petite classe que je teste d'abord en application, tente
de la passer en DLL ensuite pour espérer l'appeler de la même manière
(Server.CreateObject) avec l'ASP.



Les DLL .NET de base ne s'enregistrent pas. Il faut, pour pouvoir les
utiliser à partir d'ancienne technologie comme COM, créer un wrapper CCW
(COM Callable Wrapper). Le principe est d'encapsuler la classe .NET dans un
composant COM. Dans MSDN ou Google, tu trouveras plus d'info à ce sujet.

Si je comprends bien ce que vous me dites... il serait préférable de
mettre à jour mon appli ASP vers un projet web .NET (ASPX) pour utiliser
correctement (et facilement) cette DLL ?



Ce serait effectivement plus simple mais il faut considérer le temps passé
pour la migration. Parfois, il est impossible de faire une migration. C'est
pour cela que MS a inventé les CCW.

Avez-vous une adresse qui explique clairement et simplement tout le
mic-mac des assemblys, namespaces... etc ?



Je n'ai pas d'adresse mais Google est ton ami :-) Cependant, AMHA, tu ne
pourras acquérir une très bonne compréhension du framework qu'après la
lecture de bons bouquins. Je peux te conseiller quelques titres si tu veux.

Fabien


Merci pour votre aide ;-)

Benjamin

Fabien Bezagu a écrit :
Loupinet,

Il y a visiblement une incohérence dans ce que tu dis : tu cherches à
créer une DLL (donc on peut supposer que tu pars de rien) et tu parles
d'interopérabilité COM. .NET n'est pas COM et les assemblages .NET
compilés en DLL ne sont pas enregistrables comme l'étaient les DLL
ActiveX/COM. Je pense que c'est de là que vient ton problème puisque tu
dis que regsvr32 ne fonctionne pas...et c'est logique.

Si ta DLL est effectivement un assemblage .NET, alors rien de plus simple
: il faut ajouter la référence à ton projet Web et faire, si besoin, un
import du namespace.

Reviens nous dire si j'ai bien compris ton problème...

Fabien





Avatar
Loupinet
Fabien Bezagu a écrit :

Ce serait effectivement plus simple mais il faut considérer le temps passé
pour la migration. Parfois, il est impossible de faire une migration. C'est
pour cela que MS a inventé les CCW.



La migration ne sera pas longue, à peine le temps de me faire la main en
fait, l'application web fait 2 pages + la DLL ;-)

Je n'ai pas d'adresse mais Google est ton ami :-) Cependant, AMHA, tu ne
pourras acquérir une très bonne compréhension du framework qu'après la
lecture de bons bouquins. Je peux te conseiller quelques titres si tu veux.



Ok pour Google, j'ai maintenant un nouvel élément de recherche ("COM
Callable Wrapper") :o))
Ok pour les livres également !

Merci, tout ça s'éclaircit petit à petit !

Benjamin
Avatar
Fabien Bezagu
> Ok pour les livres également !



Deux bons livres mais c'est peut-être pas utile de les avoir tous les deux :
- Pratique de .NET et C#, de Patrick Smacchia chez O'Reilly. Il ne me quitte
jamais, c'est mon préféré. Très complet, à la fois sur le framework mais
aussi sur C#.
- Programmer MS .NET Framework, de Jeffrey Richter (traduit) chez MS Press -
Dunod. Plus exhaustif sur le framework avec des chapitres qui sont des must
de clarté (sur le Garbage Collector notamment) mais des sujets presque pas
abordés (l'interoperabilité par exemple).

A toi de voir et bonne lecture

Fabien