2010-05-07 81 views
2

我試圖通過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 

回答

1

當你在COM接口使用複雜的類型,你需要使用歸因與[StructLayout(LayoutKind.Sequential)]結構。您可以在MSDN上找到更多信息:Exported Type Conversion。由於COM需要跨越邊界編組類型,因此必須確保所有類型都可以成功複製到非託管域。引用類型不會。

1
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

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; 
    } 
} 

這種方法使您在COM接口由.NET組件暴露更多的控制。只有由接口定義的成員纔會被COM客戶端使用。

+0

是的,安東尼是正確的。 Ken的代碼可以通過暴露COM接口來增強 – Mike 2013-07-30 15:00:33