2009-08-13 6 views
1

J'ai une DLL .net qui est écrite en c sharp, qui utilise linq pour lire les données et les retourner à une autre application vba appelant. Je n'ai pas prévu cela, donc le projet initial a été écrit pour qu'il soit accessible par une autre application .net. alors maintenant je viens de découvrir qu'il y a beaucoup de choses sur l'interopérabilité .net com et quoi d'autre. J'ai donc appris que j'ai besoin d'une interface utilisateur pour le faire fonctionner, et j'ai besoin de regasm la DLL pour créer un fichier de bibliothèque de type que je peux référencer directement à partir de l'application vba/vb6Comment faire pour que mon .net dll soit référencé dans vba/com?

À partir de maintenant je reçois le problème de quand je fais cela Dim obj Comme DtasApiTool.Program, c'est bien mais sur la ligne suivante set obj = new DtasApiTool.Program provoquera une erreur sur New opérateur n'est pas utilisé correctement . quand j'ai testé another .net dll from codeproject cela fonctionne bien. Donc, ma question est, qu'est-ce que je fais mal ici?

  1. Est-ce que j'utilise trop de références, comme dans l'utilisation de system.xxx?
  2. ou est-il dû à certains fichiers que j'ai dans le fichier projets, à savoir app.config , etc.
  3. et comment puis-je le guid?

que j'ai connaissance très limitée ou de l'expérience dans tout cela, je fonde ce qui est bon ou mauvais à partir du code exemple dans le projet de code :(donc ne hésitez pas à commenter quoi que ce soit.

cette est le code que j'utilise:..

using System; 
using System.Collections.Generic; 

using System.Linq; 
using System.Text; 
using System.Configuration; 
using System.Data.OleDb; 
using System.Data; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 
//using System.Security; 
using System.Security.Cryptography; 
using System.Runtime.InteropServices; 
//using System.Windows.Forms; 

namespace DtasApiTool 
{ 
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7059")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface _Program 
    { 
    [DispId(1)] 
    string Get_All_Locales(); 

    [DispId(2)] 
    string Get_All_Levels(string locale); 

    [DispId(3)] 
    string Get_Subjects_ByLocaleLevelId(string locale, int levelId); 

    [DispId(4)] 
    string Get_Topic_ByLevelIdLocaleSubjectId(int levelId, string locale, int subjectId); 

    [DispId(5)] 
    string Get_Subtopic_ByLevelIdLocaleSubjectIdTopicId(int levelId, string locale, int subjectId, int topicId); 

    [DispId(6)] 
    string Get_Skill_ByLevelIdLocaleSubjectIdTopicIdSubtopicId(int levelId, string locale, int subjectId, int topicId, int subtopicId); 

    [DispId(7)] 
    string Get_All_Subjects(string locale); 

} 

[Guid("09FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("DtasApiTool.Program")] 
public class Program : _Program 
{ 
...} 
} 
+0

Avez-vous coché le drapeau "Register for COM interop" dans les propriétés du projet? – sharptooth

+0

yup, c'est la première chose que j'ai faite – melaos

Répondre

1

Hm - J'utilise des DLL C# tout le temps que je ne suis même pas en utilisant la méthode d'interface que vous avez là avec COM et jamais eu de problèmes C'est , par exemple, une partie anonymisée d'une DLL que j'utilise dans Microsoft Dynamics NAV via COM:

using ...; 

namespace SomeCOMTool 
{ 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ProgId("MyCOMTool")] 
    [ComVisible(true)] 
    [Guid("your-guid-here without curly brackets!")] 
    public class MyCOMTool 
    { 
     /// <summary> 
     /// Empty constructor used by Navision to create a new instance of the control. 
     /// </summary> 
     public MyCOMTool() 
     { 
     } 

     [DispId(101)] 
     public bool DoSomething(string input, ref string output) 
     { 
     } 
    } 
} 

Bien sûr, "COM visible" est défini dans les options d'assemblage et il y a également un GUID dans le champ correspondant.

+0

@Thorsten, j'ai réduit mon problème au fait que le constructeur que j'utilise a une valeur de paramètre qui semble causer le problème. donc je ne suis pas autorisé à utiliser un constructeur avec des paramètres pour cette situation? – melaos

+0

Lors de l'utilisation de COM avec Navision, le constructeur doit être sans paramètre, mais je ne peux pas vous dire si c'est toujours une exigence - pour cela, je ne connais pas assez l'interopérabilité COM. En cas de doute, supprimez le paramètre et fournissez à la place une méthode Init qui prend le paramètre et effectue l'initialisation que vous auriez effectuée dans le constructeur. –

+0

Aussi, dans votre description "set obj = ..." vous n'écrivez rien sur le paramètre - peut-être que c'est le problème? Appel du constructeur sans paramètre? –

Questions connexes