avertissement MSB3391: <DLL> ne pas contenir tous les types qui peuvent être ou non pour COM Interop
J'ai fait un simple C# DLL (qui fait partie d'un projet plus vaste) à l'aide de VS2005. J'ai besoin d'utiliser la DLL dans Excel via VBA code donc je suis en utilisant COM Interop sur l'assemblée. Je suis d'essayer de rendre le processus de construction de générer automatiquement le nécessaire fichier TLB de sorte que je n'ai pas besoin d'aller à la ligne de commande et l'utilisation regasm après chaque génération.
Mon problème est que, bien que la DLL compile et s'appuie fine, il ne génère pas un fichier TLB. Au lieu de cela, l'erreur dans le titre imprime dans la sortie de la boîte.
J'ai obtenu d'autres Dll afin de construire des fichiers TLB en allant dans les propriétés du projet dans VS2005 -> Build -> Output -> Vérifiez "s'Inscrire pour COM interop". J'ai également [assembly: ComVisible(true)] dans le AssemblyInfo.cs.
Voici le résumé de la source du problème et DLL les DLL qu'il fait référence à un type de retour:
using System;
using System.IO;
using System.Runtime.InteropServices;
using SymbolTable;
namespace ProblemLibrary
{
public class Foo
{
public Foo(string filename)
{
...
}
//method to read a text file into a SymbolTable
public SymbolTable BuildDataSet(string[] selected)
{
...
}
}
}
Voici un résumé de SymbolTable.dll. Il est titulaire d'un type de retour que ProblemLibrary utilise.
using System;
using System.Collections.Generic;
namespace SymbolTable
{
public class SymbolTable
{
readonly Dictionary<SymbolInfoStub, string> _symbols = new Dictionary<SymbolInfoStub, string>();
/*methods that interact with Dictionary snipped*/
}
}
Oui, j'ai besoin d'utiliser cette DLL dans Excel VBA.
OriginalL'auteur | 2009-05-12
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que vous avez GuidAttribute au niveau de l'assemblage.
Constructeur Vide. Qui m'écoute jamais! Merci.
C'est un peu stupide pour une classe qui doit également être utilisables dans typique .NET. Imaginez un format de fichier spécifique de la classe, qui a un constructeur acceptant un nom de fichier typique de la manière de l'instancier .NET. Maintenant, juste pour rendre cette classe COM visible, j'ai supprimer le constructeur et que je devais appeler un statique "Charge" méthode pour la qui en .NET, puis encore une instance publique / non-statique "Charge" méthode pour la créer, pour COM. Qui ressemble un peu sale, n'est-ce pas?
OriginalL'auteur
J'ai vu un problème similaire. J'ai eu une erreur de ce type:
J'ai suivi toutes les règles (ComVisible, etc.) mais rien n'a fonctionné.
Solution: j'ai dû mettre quelque chose dans le constructeur par défaut de sorte qu'il ne serait pas optimisé loin. Le moment où j'ai eu quelque chose là-bas, l'enregistrement terminé avec aucun message et le composant est visible dans le registre.
Note intéressante: un de mes amis a réussi à enregistrer la DLL originale avec le vide de constructeur par défaut sur sa machine (64 bits Windows 7, VS2008-Professionnelles, comme la mienne). Cependant, son REGASM.EXE a:
alors que le mien était:
Ainsi, il pourrait faire une différence entre les versions de la .NET framework - peut-être la version la plus récente est l'optimisation de trop et le REGASM ne pas tenir compte de cela.
OriginalL'auteur Dror Harari
Dans le AssemblyInfo.cs fichier, assurez-vous d'avoir les éléments suivants:
Mise à JOUR:
Lire: Comment puis-je faire usage de .NET les objets dans Excel VBA?
Qui des liens vers:
http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/
J'ai pris de l'autre C# Dll de travailler dans la COM avant. Bien que les liens n'ont pas de m'aider avec mon problème, j'ai appris sur le lien entre le client COM intellisense et [ClassInterface(ClassInterfaceType.AutoDual)] en C# à partir d'eux. Merci pour cela.
OriginalL'auteur NotMe