如何在vba / com中引用我的.net DLL?

时间:2009-08-13 07:33:10

标签: c# .net com interop

我有一个用c sharp编写的.net dll,它使用linq读取数据并将其返回到另一个调用vba应用程序。我没有为此计划,所以最初的项目是为了让它可以被另一个.net应用程序访问而编写的。所以现在我发现有很多关于.net com互操作性和其他东西的东西。

所以我已经知道我需要用户界面才能使它工作,我需要重新设置dll以创建一个类型库文件,我可以直接从vba / vb6应用程序引用。

截至目前我遇到的问题是,当我这样做Dim obj作为DtasApiTool.Program时,它很好,但在下一行设置obj = new DtasApiTool.Program将导致关于New运算符未正确使用的错误。当我测试another .net dll from codeproject时它工作正常。

所以我的问题是,我在这里做错了什么?

  1. 我使用了太多的引用,如 使用system.xxx?
  2. 或者它应该到期     我在的一些文件     项目,即app.config 文件等
  3. 我如何获得指导?
  4. 因为我对所有这些知识或经验非常有限,所以我基于代码项目中的示例代码来对错:(所以请随意评论任何内容。

    这是我正在使用的代码:

    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
    {
    ...}
    }
    

1 个答案:

答案 0 :(得分:1)

嗯 - 我一直在使用C#DLL并且从来没有遇到过问题。我甚至没有使用你在那里的接口方法。例如,这是我通过COM在Microsoft Dynamics NAV中使用的DLL的匿名部分:

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)
        {
        }
    }
}

当然,“COM visible”在程序集选项中设置,并且在相应的字段中也有一个GUID。