имам .net dll, написан на c#, който чете данни от източник на данни и действа като обвивка, за да позволи на други приложения да извикат неговата функция, за да извлекат тези данни. работата е там, че не очаквах .net dll да се използва за приложения, различни от .net, така че сега ми беше казано, че всичко това ще се използва в макрос vba/powerpoint, който според мен е доста подобен на приложение vb6 , така че планирам да го тествам точно сега.
след малко гугъл и дори публикуване на някакъв въпрос тук, успях да накарам dll да бъде препратен вътре във vb6, но когато се опитам да извикам функция, която има някакви параметри, ще получа съобщение за грешка по време на изпълнение 450 грешен брой аргументи или невалидно присвояване на свойства.
Въпроси
И така, какво правя грешно? и може ли някой да предостави някои ресурси или примерни кодове, които мога да науча как правилно да пиша .net dll, който има функции с параметри, които могат да бъдат извикани от приложението vb6/vba?
И ако моите кодове са твърде объркани за четене :), тогава може би вие можете да ми помогнете да ми кажете как да поставя параметрите да работят в този пример, който научавам от codeproject, връща същото съобщение за грешка, когато включа някои параметри там.
АКТУАЛИЗАЦИИ:
тук намерих друг набор от примерни кодове, но за съжаление той минава само параметри като цяло число и когато се опитам да направя примерна функция, която предава параметри като низ, получавам същата грешка. Пропускам ли нещо основно тук? някой иска да запали noobie?
Актуализации 2:
Само в случай, че има някой друг, който се натъкна на този проблем, наистина не разбрах защо или какво причинява проблема, но тъй като проектът все още беше доста малък, просто използвам работеща проба за dll, която успя да върне низ правилно и започнете да премествате функция за функция към него и сега работи добре :)
Благодаря!!!
.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