Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在vba/com中引用我的.net dll?_C#_.net_Com_Interop - Fatal编程技术网

C# 如何在vba/com中引用我的.net dll?

C# 如何在vba/com中引用我的.net dll?,c#,.net,com,interop,C#,.net,Com,Interop,我有一个.NETDLL,它是用c语言编写的,它使用linq读取数据并将数据返回给另一个调用vba的应用程序。我没有计划这样做,所以最初的项目是为了让另一个.net应用程序可以访问它而编写的。所以现在我才发现有很多关于.NETCOM互操作性的东西 因此,我了解到,我需要修改用户界面以使其正常工作,我需要重新格式化dll以创建一个类型库文件,我可以直接从vba/vb6应用程序中引用该文件 现在我遇到了一个问题,当我以DtasApiTool.Program的形式执行这个Dim obj时,它很好,但是在

我有一个.NETDLL,它是用c语言编写的,它使用linq读取数据并将数据返回给另一个调用vba的应用程序。我没有计划这样做,所以最初的项目是为了让另一个.net应用程序可以访问它而编写的。所以现在我才发现有很多关于.NETCOM互操作性的东西

因此,我了解到,我需要修改用户界面以使其正常工作,我需要重新格式化dll以创建一个类型库文件,我可以直接从vba/vb6应用程序中引用该文件

现在我遇到了一个问题,当我以DtasApiTool.Program的形式执行这个Dim obj时,它很好,但是在下一行设置obj=new dtasapitol.Program会导致一个错误,即新操作符没有被正确使用。当我测试时,它运行良好

所以我的问题是,我做错了什么

  • 我是否使用了太多的参考资料,例如 使用system.xxx
  • 还是到期 到我在 项目,即app.config 档案等
  • 如何获取guid
  • 由于我在这方面的知识或经验非常有限,所以我根据代码项目中的示例代码来判断对错:(所以请随意评论任何内容)

    这是我正在使用的代码:

    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
    {
    ...}
    }
    
    嗯-我一直在COM中使用C#DLL,从来没有遇到过问题。我甚至没有使用您那里的接口方法。例如,这是我在Microsoft Dynamics NAV中通过COM使用的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)
            {
            }
        }
    }
    
    使用。。。;
    名称空间SomeCOMTool
    {
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId(“MyCOMTool”)]
    [ComVisible(true)]
    [Guid(“此处的Guid不带花括号!”)]
    公共类MyCOMTool
    {
    /// 
    ///Navision用于创建控件新实例的空构造函数。
    /// 
    公共MyCOMTool()
    {
    }
    [DispId(101)]
    公共bool DoSomething(字符串输入,参考字符串输出)
    {
    }
    }
    }
    
    当然,“COM可见”是在程序集选项中设置的,在相应的字段中也有一个GUID。

    Hm-我一直在COM中使用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)
            {
            }
        }
    }
    
    使用。。。;
    名称空间SomeCOMTool
    {
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId(“MyCOMTool”)]
    [ComVisible(true)]
    [Guid(“此处的Guid不带花括号!”)]
    公共类MyCOMTool
    {
    /// 
    ///Navision用于创建控件新实例的空构造函数。
    /// 
    公共MyCOMTool()
    {
    }
    [DispId(101)]
    公共bool DoSomething(字符串输入,参考字符串输出)
    {
    }
    }
    }
    

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

    您是否检查了项目属性中的“为COM互操作注册”标志?是的,这是我做的第一件事您是否检查了“为COM互操作注册”项目属性中的标志?是的,这是我要做的第一件事did@Thorsten我把我的问题缩小到一个事实:我使用的构造函数有一个参数值,这似乎是导致问题的原因。所以我不允许使用任何有参数的构造函数来处理这种情况吗?当使用NavISE使用COM时,构造函数必须是PAR。毫无疑问,但我无法告诉您这是否始终是一项要求——为此,我对COM互操作了解不够。如果有疑问,请删除该参数,并提供一个Init方法,该方法接受该参数并执行您在构造函数中所做的初始化。此外,在您的描述中“set obj=…”你没有写任何关于参数的东西-也许这就是问题所在?调用没有参数的构造函数?@Thorsten,似乎我的函数中有参数存在问题。当我试图在vb6中通过函数名(参数)调用它们时我收到一个错误运行时错误450错误的参数数或无效的属性分配。我不是VB6专家,但添加“Option Explicit”可能会有所帮助在模块开始时,确保所有变量都已声明。否则,我建议您打开一个新问题,明确询问您的450错误。@Thorsten,我已将问题缩小到我使用的构造函数有一个参数值,这似乎是导致问题的原因。那么,我不允许使用任何构造函数吗在这种情况下使用带参数的tor?当使用带有Navision的COM时,构造函数必须是无参数的,但我不能告诉您这是否始终是一个要求-为此,我对COM互操作了解不够。如果有疑问,请删除该参数,改为提供一个Init方法,该方法接受该参数并执行您本应执行的初始化在构造函数中。另外,在您的描述“set obj=…”中,您没有写任何关于参数的内容-也许这就是问题所在?在没有参数的情况下调用构造函数?@Thorsten,似乎我对包含参数的函数有问题。当我试图在vb6中通过函数_name(参数)调用它们时我得到一个错误运行时错误450错误的参数数或无效的属性分配。我不是VB6专家,但在模块开头添加“Option Explicit”可能会有帮助,以确保实际声明了所有变量。否则,我建议您打开一个新问题,明确询问450错误。