我有一个用C#编写的.NET DLL,它从数据源读取数据并充当包装器,使其他应用程序可以调用其函数来检索这些数据。问题是我没有预料到.NET DLL除了.NET应用程序外还会被用于其他用途。现在有人告诉我,这将全部用于VBA/PowerPoint宏中,我想这与VB6应用程序相当类似,所以我现在正在计划进行测试。
经过一些搜索,甚至在此处发布了一些问题,我设法让DLL在VB6内被引用,但是当我尝试调用具有任何参数的函数时,我会收到错误运行时消息错误450个参数数量错误或无效的属性分配。
问题是我做错了什么?有人可以提供一些资源或示例代码吗?我可以学习如何正确编写具有参数的函数的.NET DLL,这些函数可以从VB6 / VBA应用程序中调用吗?
如果我的代码有点混乱:),那么也许你们可以帮助告诉我如何在这个我从codeproject学到的示例中使参数起作用,当我在其中包含一些参数时,它返回相同的错误消息。
更新: 我在这里找到了另一组示例代码,但不幸的是它只将参数传递为整数,当我尝试做一个将参数作为字符串传递的示例函数时,我收到相同的错误。我错过了什么基本知识吗?有人关心炮轰一个新手吗?
更新2:
以防有其他人遇到这个问题,我并没有真正找出原因或导致问题的原因,但由于项目仍然相当小,我只使用了一个能够正确返回字符串的工作示例,并开始将每个函数移动到其中,现在它很好用:)
谢谢!
以下是.NET DLL代码:
经过一些搜索,甚至在此处发布了一些问题,我设法让DLL在VB6内被引用,但是当我尝试调用具有任何参数的函数时,我会收到错误运行时消息错误450个参数数量错误或无效的属性分配。
问题是我做错了什么?有人可以提供一些资源或示例代码吗?我可以学习如何正确编写具有参数的函数的.NET DLL,这些函数可以从VB6 / VBA应用程序中调用吗?
如果我的代码有点混乱:),那么也许你们可以帮助告诉我如何在这个我从codeproject学到的示例中使参数起作用,当我在其中包含一些参数时,它返回相同的错误消息。
更新: 我在这里找到了另一组示例代码,但不幸的是它只将参数传递为整数,当我尝试做一个将参数作为字符串传递的示例函数时,我收到相同的错误。我错过了什么基本知识吗?有人关心炮轰一个新手吗?
更新2:
以防有其他人遇到这个问题,我并没有真正找出原因或导致问题的原因,但由于项目仍然相当小,我只使用了一个能够正确返回字符串的工作示例,并开始将每个函数移动到其中,现在它很好用:)
谢谢!
以下是.NET DLL代码:
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-0542A0FC7040")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface _Program
{
[DispId(1)]
string Get_All_Locales(string test);
[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);
[DispId(8)]
void Constructor(string directory);
}
[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA5")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("DtasApiTool.Program")]
public class Program : _Program
{
private string connStr = "";
private string xmlLocation = "";
public Program(){
}
public void Constructor(string directory)
{
...
}
#region This part contains all the internal functions
/// <summary>
/// return the component lesson given a locale and skill id
/// </summary>
/// <param name="locale"></param>
/// <param name="skillId"></param>
/// <returns></returns>
internal string Get_Component_Lesson(string locale, string skillId)
{
...
}
/// <summary>
/// return a xmlFile containing all the information from the Skill Analysis
/// </summary>
/// <param name="fileLocation">raw xml file location, i.e. C://datapath/raw_dato.xml</param>
/// <returns> the location of the output xml file.</returns>
internal string Process_Skill_Analysis_Report(string fileLocation)
{
...
}
#endregion
/// <summary>
/// Returns all the locale which is in the database currently.
/// </summary>
/// <returns></returns>
public string Get_All_Locales(string test)
{
...
}
}
这是我从VB6中调用它的方式:
Option Explicit
Private Sub Form_Load()
Dim obj As DtasApiTool.Program
Set obj = New DtasApiTool.Program
Dim directory As String
directory = """" + "C:\Documents and Settings\melaos\My Documents\Visual Studio 2008\Projects\app\bin\Release\" + """"
'obj.Constructor directory
Dim func As String
func = obj.Get_All_Locales(directory)
End Sub