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
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
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]);
%>
- 1. C Skaler tipini skaler olmayan ve geriye doğru nasıl dökerim?
- 2. C# İçinde Doğru Kıvrılma #
- 3. C# DataTable doğru döndürülür
- 4. Tekil uygulamam doğru mu? C#
- 5. Amaç-c Var-arg parametrelerinin doğru türde olduğundan ve sayımının
- 6. C++ -The doğru atmak yolu ve yakalamak istisnalar
- 7. Amaç - C Statik Kütüphane ve kamu başlıkları - doğru yol nedir?
- 8. Doğru Çıktı ve []
- 9. DateTime.ParseExact doğru şekilde ayrıştırma tarihi değil C#
- 10. C# doğru yolu genel yöntem uygulayarak
- 11. Neden Golang'dan doğru bir C sabitini okuyamıyorum?
- 12. strlen doğru dize uzunluğu verilmiyor C
- 13. LLVMModule ve LLVMExecutionEngine doğru şekilde nasıl yok edilir?
- 14. C# - Dize Verilerini Sekmelerle Doğru Olarak Nasıl Girin?
- 15. C# to json görünümünde doğru şekilde görüntülenmiyor
- 16. Bir C++ dizgisini kuyruktan başa doğru nasıl tersine çevirmek gerekir?
- 17. C# .NET'te doğru indirme/yükleme hızı nasıl edinilir?
- 18. kullanma List.Exists ve Predicates doğru
- 19. Yolun doğru durumunu nasıl alırım?
- 20. doğru
- 21. Metin Dosyasını C Doğru Siparişe Okuma
- 22. C++ 0x Tuples Elements Öğeleri Geriye doğru
- 23. Giriş dizesi doğru biçimde değil. C# (Yeni)
- 24. Elf dosyalarını okumak için doğru yol C
- 25. C++ 'da sabit bir C-string tanımlamak için doğru yolu?
- 26. Değişkin liste yapıcısı, nasıl doğru türe varsayılan ve
- 27. strtotime ve tarih doğru çıkmıyor
- 28. Coğrafi kodlama API'sı ne kadar doğru ve en doğru nedir?
- 29. Matplotlib grafikleri ile geriye doğru ve ileriye doğru kaydır
- 30. o ve ben C#
: '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
'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
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