2012-08-27 12 views
6

.NET dizisini COM VB6 kitaplığına geçirmeye çalışıyorum. VB6 nesnesinin COM sarıcısı olan bir nesnem var. Aşağıdaki imzayla yöntemi vardır:COM nesnelerini C# dizisi VB6'ya geçirme

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)] 
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems); 

ama onu çağırdığınızda aşağıdaki iletiyle bir ArgumentException olsun:

Değer beklenen aralıkta girmemektedir.

İstisna türü ve açıklaması, aktarılan öğeye bağlı bile değildir.

Bu sorunun nasıl giderileceğini bilen var mı?

YUKARI: .NET sarıcı derlemeleri ve başvurulan kaynak .COM kitaplıklarını kaldırdım. Hiçbir değişiklik yapılmadı.

+3

[MarshalAs] nitelik açıkça yanlıştır: Eğer yapacağını bir dizi geçirilecek istiyorsanız

(nesne yapılar farklı şekilde ele alınır, bir sınıftır). –

+0

Anlaşmalı. @ user1453239 neden bir yapı olduğunu düşündün? – tcarvin

+0

Bu declaratioin, kullanmaya çalıştığım kitaplıktan. Üçüncü taraf geliştirici tarafından sağlanmaktadır. –

cevap

0

Sen VB6 yapı biçimi yansıtmak gerekir :

[DllImport("dllname.dll")] 
public static extern void AddEx(IntPtr paramName); 

Yapıyapmak için aşağıdaki işlevleri kolayca kullanabilirsiniz.-> Girişimsel dönüşümler:

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct)); 
// do stuff 
Marshal.StructureToPtr(struct, paramName, false); 

Düzeltme: Ne yapmak istediğinizi yanlış okuyorum. Ama bu birlikte çalışmayı başlatmak için bir başlangıçtır.

Bağımsız değişken istisnası, bir referans tipi bir değer türü olarak göndermeye çalışmaktan kaynaklanır.

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param); 
0

Sana gibi dış yöntem beyanı yazabilirsiniz düşünüyorum şu:

[StructLayout(LayoutKind.Sequential)] 
public struct myStruct { 
    type1 member1; 
    type2 member2; 
} 

yapmanız gerekir işlevini aktarmak için:

[DllImport... 
public static extern void AddEx(YourType[] paramName); 

//or like the following: 

public static extern unsafe void AddEx(YourType * paramName);