C#COM对象与VB6 / asp错误

时间:2010-05-07 22:14:58

标签: c# com asp-classic vb6

我正在尝试通过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

3 个答案:

答案 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。