2009-12-11 4 views
0

Je suis en train de reconstruire zlib.net et de créer un assembly que je pourrai référencer dans les futurs projets dans Visual Studio. Cependant, après avoir construit à partir du code source fourni et déplacé le zlib.net.dll résultant vers C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies, alors que je peux en effet ajouter la référence zlib.net à un nouveau projet, je n'ai aucun accès aux objets sous-jacents . Je crois qu'il me manque certaines configurations importantes dans le fichier de paramètres du projet zlib.net.dll afin que je puisse générer un assembly qui peut être référencé au moment du design par d'autres projets. Je ne suis pas sûr de savoir lequel.C# Création d'un assembly pour référence future

Pourriez-vous m'aider s'il vous plaît?

MISE À JOUR:
Notez que je teste l'assemblage obtenu à l'aide zlib.net (lien ci-dessus) des démos fournies propres. Quand j'utilise le zlib.net.dll fourni tout fonctionne bien. Quand j'utilise celui que je construis à partir de la source, il échoue.

Répondre

2

Vous ne devriez pas jamais besoin d'ajouter quelque chose au dossier PublicAssemblies.

Placez l'assembly quelque part dans votre hiérarchie de dossiers de développement (peut-être C:\dev\Reference\zlib.net\zlib.net.dll). Lorsque vous souhaitez ajouter une référence, cliquez sur Parcourir et localisez l'assembly dans vos dossiers de développement. Cliquez ensuite sur la référence dans l'Explorateur de solutions et affichez le volet Propriétés. Assurez-vous que Copy Local est défini sur true. Si vous avez vos solutions dans le contrôle de code source, vous devez copier la DLL dans la hiérarchie de la solution actuelle et la référencer à partir de là - vous ne voulez pas forcer tout le monde à avoir un dossier spécifique de contrôle non source pour construire un projet contrôlé par la source.

+0

Merci pour le conseil. Je ferai en sorte de le faire à partir de maintenant (comme je viens de le faire). Mais comme vous pouvez le suspecter, cela n'a pas résolu le problème. –

+0

Je n'aurais jamais pensé que ça ne marcherait pas après ça, parce que de l'information limitée que vous avez posté ci-dessus, c'est seulement la chose qui a du sens d'être le problème. Quels messages d'erreur recevez-vous (vous ne les avez pas mentionnés)? –

+0

Après avoir ajouté le nouveau zlib.net.dll, j'obtiens "Erreur 1 \t Le nom de type ou d'espace de noms 'ZStream' est introuvable (manque-t-il une directive using ou une référence d'assembly?)". Cela ne se produit pas si j'utilise la DLL fournie au lieu de celle que je construis à partir du code source –

0

Que voulez-vous dire, vous n'avez pas accès aux objets sous-jacents? Voulez-vous dire que vous ne pouvez pas instancier des objets à partir de classes que vous avez définies dans cet assembly?

Si oui, êtes-vous sûr que ces classes sont 'public' (avez le modificateur d'accès public)? Il est possible que VS.NET n'ajoute pas de spécificateur d'accès à votre définition de classe lorsque vous ajoutez une nouvelle classe, par conséquent le spécificateur d'accès par défaut sera utilisé. Dans ce cas, cela signifie que le spécificateur d'accès «interne» est utilisé. (Les classes sont internes par défaut). Ensuite, cela pourrait expliquer pourquoi vous ne pouvez pas instancier des objets à partir de ces classes, puisque les classes (ou méthodes) internes (ou autres) ne sont visibles que dans l'assemblage dans lequel elles ont été déclarées.

Solution: spécifiez le modificateur d'accès 'public' sur les classes que vous voulez 'visibles' en dehors de cet assembly.

+0

Les classes concernées sont en effet publiques, Frederik. Ni j'ai apporté de modifications au code source autre que la modification de la cible de l'assembly à .Net 3.5 de 2.0 dans le fichier de configuration du projet. –

+0

-1: Je suppose que l'assemblage dont il parle fonctionne déjà pour un usage général. Il demande où placer le binaire afin que plusieurs projets puissent le référencer. –

0

La suggestion de Frederik est la première chose que je vérifierais. Vous ne pouvez pas accéder aux classes ou aux membres de classe qui ne sont pas publics dans un assembly externe.

Si elles sont déjà définies sur public, assurez-vous que vous disposez des instructions d'utilisation appropriées pour les espaces de noms des classes auxquelles vous souhaitez accéder. Donc, si vous voulez accéder ZLib.SomeNameSpace.Archive classe, assurez-vous soit par référence le nom complet, ou en ajoutant

using ZLib.SomeNameSpace; 

au fichier de code en premier.Ensuite, vous devriez être en mesure d'accéder à la classe, tels que:

Archive myArchive = new Archive(); 
+0

J'ai les bonnes affectations en place., Je le sais parce que je n'écris pas de code, mais réutilise les projets de démonstration fournis qui échouent lorsque je remplace la référence d'assemblage zlib.net actuelle pour celle que je viens de construire. (Mise à jour de ma question) –

0

En supposant que toutes vos classes sont bien public, vous avez signé votre Assemblée et ajouté au GAC?

Il y a quelques étapes à franchir, here est un petit tutoriel. Il y a quelques détails nuls, mais l'exemple auquel je suis lié devrait vous aider à aller de l'avant.

+0

J'ai fait une version signée et je l'ai d'ailleurs déjà ajoutée au GAC. Mais le GAC ne concerne que les assemblages d'exécution. Cette question concerne les assemblées au moment du design –

Questions connexes