passing structures from VC++/ MFC application to C# dll

What is the best way of passing information from a VC+MFC application which will be calling C# dll to pass information.. what should be efficient some kind of binary structure or XML .. please notethat the data size is huge
LVL 1
pras_guptaAsked:
Who is Participating?
 
Jaime OlivaresConnect With a Mentor Software ArchitectCommented:
just pass the pointer to the array.
0
 
Jaime OlivaresSoftware ArchitectCommented:
what kind of information?
XML will be 100% safe but will be bigger than binary.
0
 
Jaime OlivaresSoftware ArchitectCommented:
0
Cloud Class® Course: Microsoft Windows 7 Basic

This introductory course to Windows 7 environment will teach you about working with the Windows operating system. You will learn about basic functions including start menu; the desktop; managing files, folders, and libraries.

 
pras_guptaAuthor Commented:
Ok , i am using a bit similar approach now. I have two choices that either i pass an array of values to the C# component or call the class struct in c# component and populate that from the VC++. which way will be faster. Passing a array or populating a class struct in a loop in C#.
CClass:: RunXXX()
{
HRESULT hr = CoInitialize(NULL);
 
// create the interface pointer.
IManager pIRule(__uuidof(XXXBase));
 
//Call the method for populating input for processing
pIRule -> AddInputStructures(	long m_lProductId,
long m_lFieldId,
long m_lFieldValue,
string m_strType,
bool m_bDisabled, 
bool m_bEmpty,
bool m_bRequired);
pIRule ->GetOutPutVariables();
}
 vs 
i create and pass a array to the component 

Open in new window

0
 
Jaime OlivaresSoftware ArchitectCommented:
Passing array or class will have similar performance.

0
 
pras_guptaAuthor Commented:
I think i have make myself more clear now . Say I have a data of approximatly around 1000 numbers. I have two choices here.1
I loop thru all the 1000 values and populate a array in VC++ and pass it to the C# dll.
2. I loop thru 1000 values and populate the class in c# component and internally C# dll uses it. in this case i am making 1000 calls to the c# dll. like below code will be called 1000 times.
pIRule -> AddInputStructures(      long m_lProductId,
long m_lFieldId,
long m_lFieldValue,
string m_strType,
bool m_bDisabled,
bool m_bEmpty,
bool m_bRequired);
pIRule ->GetOutPutVariables();
}


In this scenario what do you think will be faster.
0
 
Jaime OlivaresSoftware ArchitectCommented:
the 1000 calls will make your code significative slower than passing the entire array once.
0
 
pras_guptaAuthor Commented:
Thanks, what do you suggest is the best way to pass a array from VC++ to C# dll
0
 
pras_guptaAuthor Commented:
I am doing this now is there a better way


  double dFieldId[5]      = { 111111, 222222, 333333, 444444, 555555 } ;
 
      double dFieldValue[5] = { 100001, 200002, 300003, 400004, 500005 } ;
 
      double dType[5]   = { 0,1,0,1,0 } ;
 
      double dDisabled[5]     = { 1,0,1,0,1 } ;
 
 
 
      // Create an global instance for ISplitArrayPtr Interface 
 
      ISplitArrayPtr objSplitArray ;
 
      hr = objSplitArray.CreateInstance (__uuidof(CSplitArray)) ;
 
      
 
      long m_Size = 5 ; 
 
      objSplitArray->InitializeArray(m_Size) ;
 
 
 
      SAFEARRAY* sArrayId ;
 
      SAFEARRAY* sArrayValue ;
 
      SAFEARRAY* sArrayType; 
 
      SAFEARRAY* sArrayDisabled ; 
 
 
 
      
 
      SAFEARRAYBOUND sabounds[1];
 
      sabounds[0].lLbound = 0;
 
      sabounds[0].cElements = m_Size ;
 
      sArrayId = SafeArrayCreate(VT_R8, 1, sabounds);
 
      sArrayValue = SafeArrayCreate(VT_R8, 1, sabounds); 
 
      sArrayType = SafeArrayCreate(VT_R8, 1, sabounds);
 
      sArrayDisabled = SafeArrayCreate(VT_R8, 1, sabounds); 
 
      
 
      //if ( *sArrayId == NULL || *sArrayValue == NULL || *sArrayType == NULL || *sArrayDisabled == NULL )
 
      //    return E_OUTOFMEMORY;
 
      
 
      long lx[1] = {0L};      
 
      double dVal = 0 ;
 
      for ( long lIndex = 0 ; lIndex < m_Size ; lIndex++ )
 
      {
 
            lx[0] = lIndex;
 
                   
 
            HRESULT hr1 ;
 
 
 
            dVal = dFieldId[lIndex] ;           
 
            hr1 = ::SafeArrayPutElement(sArrayId, lx, &dVal);                                   
 
            dVal = dFieldValue[lIndex] ;        
 
            hr1 = ::SafeArrayPutElement(sArrayValue, lx, &dVal);                                      
 
            dVal = dType[lIndex] ;        
 
            hr1 = ::SafeArrayPutElement(sArrayType, lx, &dVal);                                       
 
            dVal = dDisabled[lIndex] ;          
 
            hr1 = ::SafeArrayPutElement(sArrayDisabled, lx, &dVal);                                   
 
      }
 
      
 
      objSplitArray->PopulateFields( sArrayId, sArrayValue, sArrayType, sArrayDisabled ) ;
 
      objSplitArray->DisplayFields() ;

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.