2011-02-22 22 views
13

Bir klasik asp sitesinde kullanılmak üzere C# bir COM nesnesi (Net 4.0) inşa ediyorum yazılan COM bileşeninden VB-Script diziler sıralamakta. Şimdi bileşen ve asp sitesi arasında ileri ve geri VB-Script dizileri (tek ve çok boyutlu) ileri ve geri yollamak için uygun yolu bilmek ister misiniz? Bir kod örneği çok takdir edilecektir.Nasıl doğru ve C#

cevap

17

VBScript sadece SAFEARRAY varyasyonlarınızdan içerdiğini işlemek için sever. Ve COM yöntemleri veya özellikleri üzerinde VARIANTS içinde bu tür etrafında geçti sahip olmak ister. Bu nedenle, VARIANT türünden SAFEARRAY içeren bir VARIANT özelliği oluşturmanız gerekir. Aşağıdaki C# kodu bunu yapar. İlk önce sadece düz bir nesne dizisi kullanarak ve daha sonra başka bir yönetilen dizinin bir dizisini bir dizi nesneye atabileceğimizi göstereceğiz. Böylece, kodlama kodu bunu bizim için VARYANT'lerin SAFEARRAY'ına dönüştürecektir.

using System; 
using System.Runtime.InteropServices; 
using System.Linq; 

namespace StackOverflow 
{ 
    [ComVisible(true)] 
    [Guid("2F4C19A6-9BB9-4ACF-90D1-BAF48696740A")] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    public interface IMyArrayDemo 
    { 
     [DispId(1)] 
     int Count 
     { 
      [return: MarshalAs(UnmanagedType.I4)] 
      get; 
     } 
     [DispId(2)] 
     object Data 
     { 
      [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] 
      get; 
     } 
     [DispId(3)] 
     object Names 
     { 
      [return: MarshalAs(UnmanagedType.Struct, SafeArraySubType = VarEnum.VT_ARRAY)] 
      get; 
     } 
    } 

    [ComVisible(true)] 
    [Guid("7EF75834-22BE-4861-879B-EA0CE20E46E9")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ProgId("StackOverflow.MyArrayDemo")] 
    public class MyArrayDemo : IMyArrayDemo 
    { 
     object[] mData = new object[10] { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 }; 
     string[] mNames = new string[5] {"one", "two", "three", "four", "five"}; 
     public int Count { get { return mData.Length; } } 
     public object Data { get { return mData; } } 
     public object Names { get { return mNames.Cast<object>().ToArray(); } } 
    } 
} 

Bu

aşağıdaki vbscript kullanılarak test edilebilir:
Option Explicit 
Sub Main 
    Dim o, v 
    Set o = CreateObject("StackOverflow.MyArrayDemo") 
    WScript.Echo "Count " & o.Count & " type: " & TypeName(o.Data) & " names: " & TypeName(o.Names) 
    For Each v in o.Data : WScript.Echo CStr(v) : Next 
    For Each v in o.Names : WScript.Echo v : Next 
End Sub 
Main

Sen Varyant() olarak burada bildirilen türünü görebilirsiniz - yani: varyantları bir dizi.

C:\Users\pat>\windows\SysWOW64\cscript.exe -nologo arraytest.vbs 
Count 10 type: Variant() names: Variant() 
0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
one 
two 
three 
four 
five
+0

: 'dize [] 'Dökme' için bir tanım ve bir birinci argüman kabul uzatma yöntemi 'Dökme' içermez 'string []' bulunamaz (kullanma yönergesi veya derleme başvurusu eksik misiniz?) – Graham

+0

'Cast' yöntemi System.Linq ad alanında sağlanmıştır ve System.Core derlemesinde sağlanmıştır (bkz. http: // msdn.microsoft.com/en-us/library/bb341406.aspx) böylece varsayılan bir proje, ihtiyacınız olan tüm referanslara sahip olmalıdır. Projemin kopyasında System, System.Core ve Microsoft.CSharp için referanslar var ve başka bir şey yok. Kullanılan blok yukarıda gösterildiği gibidir. Bunu Visual Studio 2010 ile oluşturdum ama 2008 de iyi olmalı. – patthoyts

+0

Referanslarım, üçünü ve diğerleri arasında System.Xml.Linq'i de içerir. 2010 kullanıyorum. Sadece bu 3'e ve hala hataya indirgenmiş referanslar var. – Graham

2

bir cevap ancak bazı ek bilgiler Çok değil: (

<%@Language=VBScript%> 
<% 
    Dim o, v 
    Set o = CreateObject("StackOverflow.MyArrayDemo") 
    Response.Write "Count " & o.Count & " type: " & TypeName(o.Data) & " names: " & TypeName(o.Names) 
    For Each v in o.Data 
    Response.Write "<br />" & v 
    Next 
    For Each v in o.Names 
    Response.Write "<br />" & v 
    Next 
%> 

Ben bireysel dizi elemanlarını erişemez:

Bu VBScript kullanarak Klasik ASP patthoyts' cevabını tüketmek nasıl Örneğin o.Names (2)), bir dizinin değil, daha çok bir koleksiyon gibi hareket ettiğini gösterir.

JScript sürüm: mNames.Cast hattında aşağıdaki hata Alma

<%@Language=JScript%> 
<% 
    var o, v; 
    o = Server.CreateObject("StackOverflow.MyArrayDemo") 
    Response.Write ("Count " + o.Count + " type: " + (typeof o.Data) + " names: " + (typeof o.Names)); 

    var a = o.Data.toArray(); 
    for (v=0; v<a.length; v++) 
    Response.Write ("<br />" + a[v]); 

    var b = o.Names.toArray(); 
    for (v=0; v<b.length; v++) 
    Response.Write ("<br />" + b[v]); 
%> 
İlgili konular