【发布时间】:2009-08-13 07:33:09
【问题描述】:
我有一个用 c sharp 编写的 .net dll,它使用 linq 读取数据并将其返回给另一个调用 vba 应用程序。我没有为此计划,所以最初的项目是为了让另一个 .net 应用程序可以访问它而编写的。所以现在我才发现有很多关于 .net com 互操作性的东西。
所以我了解到我需要用户界面才能使其工作,并且我需要重新加载 dll 以创建一个类型库文件,我可以直接从 vba/vb6 应用程序引用该文件。
到目前为止,我遇到的问题是,当我执行此 Dim obj As DtasApiTool.Program 时,这很好,但在下一行设置 obj = new DtasApiTool.Program 将导致新运算符未正确使用的错误。当我测试another .net dll from codeproject 时,它工作正常。
所以我的问题是,我在这里做错了什么?
- 我是否使用了太多引用,例如 使用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 互操作”标志?
-
是的,这是我做的第一件事