C# 如何在vba/com中引用我的.net dll?
我有一个.NETDLL,它是用c语言编写的,它使用linq读取数据并将数据返回给另一个调用vba的应用程序。我没有计划这样做,所以最初的项目是为了让另一个.net应用程序可以访问它而编写的。所以现在我才发现有很多关于.NETCOM互操作性的东西 因此,我了解到,我需要修改用户界面以使其正常工作,我需要重新格式化dll以创建一个类型库文件,我可以直接从vba/vb6应用程序中引用该文件 现在我遇到了一个问题,当我以DtasApiTool.Program的形式执行这个Dim obj时,它很好,但是在下一行设置obj=new dtasapitol.Program会导致一个错误,即新操作符没有被正确使用。当我测试时,它运行良好 所以我的问题是,我做错了什么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时,它很好,但是在
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错误。