C#COM对象与VB6/ASP错误
我试图通过COM公开C#类库,以便我可以在经典的ASP网站中使用它。C#COM对象与VB6/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
当你在COM接口使用复杂的类型,你需要使用归因与[StructLayout(LayoutKind.Sequential)]
结构。您可以在MSDN上找到更多信息:Exported Type Conversion。由于COM需要跨越边界编组类型,因此必须确保所有类型都可以成功复制到非托管域。引用类型不会。
public string EchoPerson(ref Person p)
由于您使用ref关键字声明参数,因此出现错误。这是不正确的,Person已经是一个引用类型,VB6使用的对象是变体,而不是Person。只是省略“ref”。使用Option Explicit On是VB6顺便说一句的好习惯。
您没有得到IntelliSense,因为您可能没有声明与[InterfaceType(ComInterfaceType.InerfaceIsDual)]的接口。由于双接口的DLL地狱问题,微软建议不要这样做。虽然需要一个类型库来帮助VB6显示你想要的信息。
这里是你应该考虑使用模式: -
[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;
}
}
这种方法使您在COM接口由.NET组件暴露更多的控制。只有由接口定义的成员才会被COM客户端使用。
是的,安东尼是正确的。 Ken的代码可以通过暴露COM接口来增强 – Mike 2013-07-30 15:00:33
VB6中的“Option Strict On”?在VB.NET是的,但不是VB6只是选项明确 – AnthonyWJones 2010-05-11 23:43:44