带有VB6/asp错误的C#COM对象

带有VB6/asp错误的C#COM对象,c#,com,asp-classic,vb6,C#,Com,Asp Classic,Vb6,我正试图通过COM公开一个C#类库,以便在一个经典的asp网站中使用它 我用过sn-k,regasm和gacutil。现在我所能做的就是回显字符串 以类变量作为输入的方法对我不起作用。ie我的测试方法EchoPerson(Person p)返回一个名和姓的字符串不起作用。我得到一个运行时错误5-无效的过程调用或参数 请让我知道我错过了什么。我也没有VB的智能。我需要做什么才能让智能正常工作 下面是我的C#测试代码 namespace MrdcToFastCom { public cla

我正试图通过COM公开一个C#类库,以便在一个经典的asp网站中使用它

我用过sn-k,regasm和gacutil。现在我所能做的就是回显字符串

以类变量作为输入的方法对我不起作用。ie我的测试方法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上找到更多信息:。由于COM必须跨边界封送类型,因此必须确保所有类型都可以成功复制到非托管区域。引用类型不会成功

 public string EchoPerson(ref Person p)
由于使用ref关键字声明参数,因此出现错误。这是不正确的,Person已经是引用类型,VB6使用的对象是变体,而不是Person。只需省略“ref”。在VB6 btw中使用Option Explicit On是一种很好的做法


您没有获得IntelliSense,因为您可能没有使用[InterfaceType(ComInterfaceType.InerfaceIsDual)]声明接口。Microsoft建议不要这样做,因为双接口存在DLL地狱问题。虽然需要得到一个类型库来帮助VB6显示你想要的。

< P>这是你应该考虑使用的模式:-< /P>
[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客户端使用。

VB6中的“Option Strict On”(选项严格开启)?在VB.NET中是的,但不是VB6,只是选项明确,Anthony是对的。肯的代码可以通过公开COM接口得到很大的增强