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显示你想要的信息。

+0

VB6中的“Option Strict On”?在VB.NET是的,但不是VB6只是选项明确 – AnthonyWJones 2010-05-11 23:43:44

这里是你应该考虑使用模式: -

[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客户端使用。

+0

是的,安东尼是正确的。 Ken的代码可以通过暴露COM接口来增强 – Mike 2013-07-30 15:00:33