Hello, Neale.

You should not use ByValArray enumeration member on function arguments. MS.NET SDK documentation says that ByValArray should be used only for structure members.

Are you passing byte arrays as in or out arguments?

What is the prototype of your C function?
1. int scumbag( int* X, char** fb, int lFb, ...)
2. int scumbag( int* X, char* fb, int lFb...)
3. int scumbag( int* X, char** fb, int* lFb...)

[EMAIL PROTECTED] wrote:

Thanks Dmitry,
 I tried this and am getting the following when compiling this simple test case:

using System;
using System.Text;
using System.Runtime.InteropServices;

public class main {

                [DllImport("libname", EntryPoint = "scumbag")]
                private unsafe static extern int scumbag(ref int X,
                [MarshalAs(UnmanagedType.ByValArray, SizeParamIndex=2)] ref byte[] fb,
                long  lFb,
                [MarshalAs(UnmanagedType.ByValArray, SizeParamIndex=4)] ref byte[] rb,
                long  lRb,
                [MarshalAs(UnmanagedType.ByValArray, SizeParamIndex=6)] ref byte[] sb,
                long  lSb,
                [MarshalAs(UnmanagedType.ByValArray, SizeParamIndex=8)] ref byte[] vb,
                long  lVb,
                [MarshalAs(UnmanagedType.ByValArray, SizeParamIndex=10)] ref byte[] ib,
                long  lIb);

        static void Main() {
                int rc;
                Console.WriteLine("Waiting..");
                string line = Console.ReadLine();
        }

}


mcs marsh.cs -unsafe

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object in <0x0000034c> Mono.CSharp.Attribute:GetMarshal () in <0x00000054> Mono.CSharp.ParameterBase:ApplyAttributeBuilder (Mono.CSharp.Attribute,System.Reflection.Emit.CustomAttributeBuilder) in <0x0000009c> Mono.CSharp.Parameter:ApplyAttributeBuilder (Mono.CSharp.Attribute,System.Reflection.Emit.CustomAttributeBuilder) in <0x000001a4> Mono.CSharp.Attribute:Emit (Mono.CSharp.EmitContext,Mono.CSharp.Attributable,System.Collections.Specialized.ListDictionary) in <0x0000011c> Mono.CSharp.Attributes:Emit (Mono.CSharp.EmitContext,Mono.CSharp.Attributable) in <0x0000012c> Mono.CSharp.Parameter:DefineParameter (Mono.CSharp.EmitContext,System.Reflection.Emit.MethodBuilder,System.Reflection.Emit.ConstructorBuilder,int,Mono.CSharp.Location) in <0x00000158> Mono.CSharp.Parameters:LabelParameters (Mono.CSharp.EmitContext,System.Reflection.MethodBase,Mono.CSharp.Location) in <0x0000027a> Mono.CSharp.MethodData:Emit (Mono.CSharp.TypeContainer,Mono.CSharp.Attributable) in <0x00000032> Mono.CSharp.Method:Emit () in <0x000007d2> Mono.CSharp.TypeContainer:EmitType () in <0x00000672> Mono.CSharp.RootContext:EmitCode () in <0x00001334> Mono.CSharp.Driver:MainDriver (string[]) in <0x00000026> Mono.CSharp.Driver:Main (string[])

-----Original Message-----
Hello, Neale.

You could use:

extern static void f([MarshalAs(UnmanagedType.LPArray] byte[] p, int size);

C function:
void f(char* p, int size) {}

C# call:

byte[] val = new byte[1024];

f(val, val.Length);
_______________________________________________
Mono-list maillist  -  [EMAIL PROTECTED]
http://lists.ximian.com/mailman/listinfo/mono-list



-- Dmitry Kostenko .NET Developer _______________________________________________ Mono-list maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to