我有一个用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时它工作正常。
所以我的问题是,我在这里做错了什么?
因为我对所有这些知识或经验非常有限,所以我基于代码项目中的示例代码来对错:(所以请随意评论任何内容。
这是我正在使用的代码:
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 :(得分: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。