Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Languages / Managed C++ / April 2007

Tip: Looking for answers? Try searching our database.

exporting a struct with an array from a C++ dll to be accessed in C#

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
AM - 18 Apr 2007 17:21 GMT
Hi,
   I have a C++ Dll that has a function that is being exported as
shown below

extern "C" __declspec(dllexport) validationResult __stdcall
_validateData(double dataToMat[], int time);

A structure is defined in the header(.h file) as shown below
struct validationResult
{
       int rWaveValid; //validity of the WAVE
    int signalStatusArray[4]; //validity of each of the channel data -
'causing the problems'
};

I need to call the above method from C# in where i have the following
structure defined
public struct validationResult
   {
       public int micDataValid; //validity of the microphone data
       public int rWaveValid; //validity of the r Wave
       public int[] signalStatusArray; //validity of each of the
channel data
   };

And my function call is as shown
validationResult res = new validationResult();
res.signalStatusArray = new int[4];
res = _validateData(dataToMat, 2);

When the last line is reached i get an exception that says"Method's
type signature is not PInvoke compatible"
What am I doing wrong.

I know the issue is at the array inside the struct, as when I remove
the array from the C++ struct and the C# struct I get the right
response.

Thanks in Advance.
abhi M
Ben Voigt - 18 Apr 2007 19:01 GMT
> Hi,
>    I have a C++ Dll that has a function that is being exported as
[quoted text clipped - 16 lines]
>    {
>        public int micDataValid; //validity of the microphone data

magically appeared?

>        public int rWaveValid; //validity of the r Wave
>        public int[] signalStatusArray; //validity of each of the
> channel data

No, that doesn't match.  A dynamically resizeable array is not the same as
an inline array of size 4.  Look for the 'fixed' keyword in the C# help.

>    };
>
[quoted text clipped - 13 lines]
> Thanks in Advance.
> abhi M
AM - 18 Apr 2007 19:39 GMT
I guess i did not copy my code correctly.
Here is what my C# struct looks like

public struct validationResult
   {
       public int rWaveValid; //validity of the r Wave
       public int[] signalStatusArray; //validity of each of the
      //channel data
   };

Are you suggesting that the the error is caused by my array definition
in C# is dynamic (because of the []), while my C++ array is of size 4?

> > Hi,
> >    I have a C++ Dll that has a function that is being exported as
[quoted text clipped - 43 lines]
> > Thanks in Advance.
> > abhi M
Willy Denoyette [MVP] - 18 Apr 2007 22:08 GMT
>I guess i did not copy my code correctly.
> Here is what my C# struct looks like
[quoted text clipped - 8 lines]
> Are you suggesting that the the error is caused by my array definition
> in C# is dynamic (because of the []), while my C++ array is of size 4?

Hard to tell, as you did not post the function declaration (C#), also I'm not clear on why
you allocate a managed array in C# while your C function returns a pointer (to an array in
unmanaged memory).

res.signalStatusArray = new int[4]; // WHY????
res = _validateData(dataToMat, 2); //res is returned from C, it's a pointer right???

I would suggest you to post a complete sample that illustrates the issue.

Willy.
AM - 19 Apr 2007 14:29 GMT
Here is my C++ code

#include "CppMatlabWrapper.h"
#include <exception>
#include <string>
using namespace std;

//Method to validate the data
extern "C" __declspec(dllexport) validationResult __stdcall
_validateData(double dataToMat[], int time)
{
  validationResult res;
  res.signalStatusArray[0]=1;
  res.signalStatusArray[1]=2;
  res.signalStatusArray[2]=3;
   res.signalStatusArray[3]=4;
  res.micDataValid = (int)(dataToMat[0]*100);
  res.rWaveValid = (int)(dataToMat[1]*100);
  return res;
}

------------
Here is the header file CppMatlabWrapper.h
//Structure to store the result of the validation operation
struct validationResult
{
    int micDataValid; //validity of the microphone data
    int rWaveValid; //validity of the r Wave
    int signalStatusArray[4]; //validity of each of the channel data
};
extern "C" __declspec(dllexport) validationResult __stdcall
_validateData(double dataToMat[], int time);

This C++ code compiled gives me the library "CppMatlabWrapper.dll"
--------------------------------------------------------------------

Here is the C# code to access this library
using System;
using System.Runtime.InteropServices;

namespace MatlabWrapper
{
   class Program
   {

       //Structure to receive the result of the validation operation
       public struct validationResult
       {
           public int micDataValid; //validity of the microphone data
           public int rWaveValid; //validity of the r Wave
           public fixed int signalStatusArray[4];
       };

       [DllImport("CppMatlabWrapper.dll")]
       static extern validationResult _validateData(double[] data,
int time);

       static void Main(string[] args)
       {
            //code for creating a double array called dataToMat of
some size
            //
            validationResult res;
            res = _validateData(dataToMat, 2);
       }
   }
}

THANKS
________

On Apr 18, 5:08 pm, "Willy Denoyette [MVP]"
<willy.denoye...@telenet.be> wrote:

> >I guess i did not copy my code correctly.
> > Here is what my C# struct looks like
[quoted text clipped - 19 lines]
>
> Willy.
Ben Voigt - 19 Apr 2007 15:31 GMT
>I guess i did not copy my code correctly.
> Here is what my C# struct looks like
[quoted text clipped - 8 lines]
> Are you suggesting that the the error is caused by my array definition
> in C# is dynamic (because of the []), while my C++ array is of size 4?

I am suggesting looking at the documentation for C# fixed-size buffers which
is here: http://msdn2.microsoft.com/en-us/library/zycewsya(VS.80).aspx

A dynamic (.NET) array carries additional stuff with it like length.
Additionally, since .NET arrays are ref class, only a pointer is stored in
the structure.  This is totally different from the layout used by the C++
structure definition you gave.

>> > Hi,
>> >    I have a C++ Dll that has a function that is being exported as
[quoted text clipped - 44 lines]
>> > Thanks in Advance.
>> > abhi M
AM - 19 Apr 2007 16:41 GMT
In that case what should my C# definition look like for the
corresponding C++ definition mentioned below?

C++ struct
struct validationResult
{
       int micDataValid; //validity of the microphone data
       int rWaveValid; //validity of the r Wave
       int signalStatusArray[4]; //validity of each of the channel
data
};

Thanks

> >I guess i did not copy my code correctly.
> > Here is what my C# struct looks like
[quoted text clipped - 69 lines]
> >> > Thanks in Advance.
> >> > abhi M
Ben Voigt - 19 Apr 2007 16:52 GMT
> In that case what should my C# definition look like for the
> corresponding C++ definition mentioned below?
[quoted text clipped - 7 lines]
> data
> };

C# (not compile tested)

unsafe struct validationResult
{
      int micDataValid; //validity of the microphone data
      int rWaveValid; //validity of the r Wave
      fixed int signalStatusArray[4]; //validity of each of the channel
data
};

or

struct validationResult
{
      int micDataValid; //validity of the microphone data
      int rWaveValid; //validity of the r Wave
      int signalStatusArray_0; //validity of each of the channel data
      int signalStatusArray_1;
      int signalStatusArray_2;
      int signalStatusArray_3;
};

> Thanks
>
[quoted text clipped - 76 lines]
>> >> > Thanks in Advance.
>> >> > abhi M
AM - 19 Apr 2007 18:41 GMT
When I use the struct u suggested
unsafe struct validationResult
{
      int micDataValid; //validity of the microphone data
      int rWaveValid; //validity of the r Wave
      fixed int signalStatusArray[4]; //validity of each of the
channel
data

};
I get the following error.
Unable to find an entry point named '_validateData' in DLL
'CppMatlabWrapper.dll'.

This error goes away When i remove the array fro both the C++ and the
C# structs. So I think It has something to do with the way my array is
declared in the struct.

Thanks.

> > In that case what should my C# definition look like for the
> > corresponding C++ definition mentioned below?
[quoted text clipped - 116 lines]
> >> >> > Thanks in Advance.
> >> >> > abhi M
AM - 23 Apr 2007 18:16 GMT
Just so you guys know, I found a solution to the problem at the MSDN
forums. Here is a listing of the code

Code - header file

Header file
//Structure to store the result of the validation operation
struct validationResult
{
   int micDataValid; //validity of the microphone data
   int rWaveValid; //validity of the r Wave
   int signalStatusArray[4]; //validity of each of the channel data -
causing the problems
};

extern "C" __declspec(dllexport) void __stdcall _validateData(double
dataToMat[], int time, validationResult *retval);

Code  - CPP file

Cpp file
extern "C" __declspec(dllexport) void __stdcall _validateData(double
dataToMat[], int time, validationResult *retval)
{

   retval->micDataValid = 10;
   retval->rWaveValid  =20;

   retval->signalStatusArray[0] =1;
   retval->signalStatusArray[1] =2;
   retval->signalStatusArray[2] =3;
   retval->signalStatusArray[3] =4;
   return;
}

Code - C# code

Here is a listing of the C# code
class Program
{
        unsafe struct validationResult
       {
           int micDataValid;
           int rWaveValid;
           fixed int signalStatusArray[4];
       }
       static void Main(string[] args)
       {
          validationResult res;
          _validateData(dataToMat, 2,out res);

        //assume dataToMat is an array with                    //
data already in it
       }
}
----------------------------------

Thanks again.

> When I use the struct u suggested
> unsafe struct validationResult
[quoted text clipped - 141 lines]
> > >> >> > Thanks in Advance.
> > >> >> > abhi M

Rate this thread:







Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.