我正在尝试通过COM公开一个C#类库,以便我可以在经典的asp网站中使用它。
我使用过sn-k,regasm和gacutil。关于我现在可以做的所有事情虽然是回声串。
将类变量作为输入的方法对我不起作用。即我的测试方法EchoPerson(Person p)返回一个名字和姓氏的字符串不起作用。我收到运行时错误5 - 无效的过程调用或参数。
请让我知道我错过了什么。我在VB中也没有智慧。我需要做些什么才能使智能工作。
以下是我的C#测试代码
namespace MrdcToFastCom
{
public class Person : MrdcToFastCom.IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class ComTester : MrdcToFastCom.IComTester
{
public string EchoString(string s)
{
return ("Echo: " + s);
}
public string Hello()
{
return "Hello";
}
public string EchoPerson(ref Person p)
{
return string.Format("{0} {1}", p.FirstName, p.LastName);
}
}
}
和VB6调用
Private Sub btnClickMe_Click()
Dim ct
Set ct = New MrdcToFastCom.ComTester
Dim p
Set p = New MrdcToFastCom.Person
p.FirstName = "Joe"
p.LastName = "Test"
Dim s
s = ct.EchoPerson(p) ''#Error on this line
tbx1.Text = s
End Sub
答案 0 :(得分:2)
以下是您应该考虑使用的模式: -
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("B4CAC74B-ADE0-4ac7-AD0E-26E6439F9CF7")]
public interface _IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("A3C553DC-A348-43e4-957A-F94D23E3300E")]
public class Person : _IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("4B527235-6738-4853-BEA0-FB3087C89291")]
public interface _ComTester
{
string EchoPerson(Person person);
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("C753D72B-C802-44ae-946A-E3F6D7C5D14B")]
public class ComTester : _ComTester
{
public string EchoPerson(Person person)
{
return person.FirstName + " " + person.LastName;
}
}
此方法使您可以更好地控制.NET组件公开的COM接口。只有接口定义的成员才会被COM客户端使用。
答案 1 :(得分:1)
在COM接口中使用复杂类型时,需要使用归因于[StructLayout(LayoutKind.Sequential)]
的结构。您可以在MSDN上找到更多信息:Exported Type Conversion。由于COM必须跨越边界编组类型,因此必须确保所有类型都可以成功复制到非托管域。参考类型不会成功。
答案 2 :(得分:1)
public string EchoPerson(ref Person p)
您收到错误是因为您使用ref关键字声明了参数。这不正确,Person已经是一个引用类型,VB6使用的对象是一个变体,而不是Person。只需省略“ref”。使用Option Explicit On是VB6 btw中的一个很好的实践。
您没有获得IntelliSense,因为您可能没有使用[InterfaceType(ComInterfaceType.InerfaceIsDual)]声明接口。由于双接口的DLL Hell问题,Microsoft建议不要这样做。虽然需要一个类型库来帮助VB6显示你想要的IS。