簡體   English   中英

使用dllimport從C#代碼更新C dll結構數組及其元素值

[英]Updating an C dll struct array and its elements values from C# code using dllimport

我有將構建為動態庫(DLL)的C代碼,我想使用從C代碼創建的dLL從C#調用C函數

C代碼:

struct data
{
  char data_val1[100];
  float data_val2;
  float data_val3[50];
};
typedef struct data data;

#ifdef __cplusplus
extern "C" __declspec(dllexport) void cfun_call(data *pdata,long count);
#endif

#ifdef __cplusplus
extern "C"
{
#endif

__declspec(dllexport) void cfun_call(data *pdata,long count)
 {
   int x = 0;
   for(x=0;x<count;x++)
   {
     data[x].data_val2 = (pdata->data_val3[49] + pdata->data_val3[48]) / 2.0;
   }
 }
#ifdef __cplusplus
}
#endif  

在這里,我想在C#代碼中導入函數“ cfun_call”,並將值傳遞給fucntion調用,並處理dll中C函數中傳遞的值,並希望將更新后的值顯示回C#代碼並顯示, C#的專業知識有限,我需要一些幫助來解決此問題

C#代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

class Program
{
     public class data
     {
         public char[] data_val1 = new char[100];
         public float data_val2;
         public float[] data_val3 = new float[50];

     };
     [DllImport("mycdll.dll", EntryPoint = "cfun_call", CallingConvention =     CallingConvention.Cdecl, ExactSpelling = false)] 
     // void cfun_call(data *pdata,long count); //C function for reference
     public static extern void cfun_call([In, Out] data[] ouputdata, long count);
     static void Main(string[] args)
     {
            data[] objData = new data[10];
            for (int i = 0; i < 10; i++)
            {
                //Fill the data in objitemData
                objData[i] = new objData();
                for (int j = 0; j < 100; j++)
                {
                   objData[i].data_val1[j] =  '\0';
                }

                for (int k = 0; k < 50; k++)
                {
                  objData[i].data_val3[k] = 20.00;
                }
                objData[i].data_val2 = 0.00;
            }

            cfun_call(objData,10); //Making call to C dll function

            for (int i = 0; i < 10; i++)
                Console.WriteLine("{0} ", objData[i].data_val2);

             Console.WriteLine("");//new line
             Console.ReadLine();

     }
 }

在這里,從C#函數傳遞的值(objData)不會通過使用C dll功能更新,我不確定為什么。 誰能指出我正確的方向?

編輯1:

我已經按照建議更新了代碼,

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct data
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
    public char[] data_val1;
    public float data_val2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
    public float[] data_val3;
};

初始化的struct元素,如下所示,

    data[] objData = new data[10];

    for (int i = 0; i < 10; i++)
    {
        //Fill the data in objitemData
        objData[i] = new objData();
        for (int j = 0; j < 100; j++)
        {
           objData[i].data_val1[j] =  '\0'; //I am getting exception here 
        }

        for (int k = 0; k < 50; k++)
        {
          objData[i].data_val3[k] = 20.00;
        }
        objData[i].data_val2 = 0.00;
    }

運行時我得到null ptr異常,如

mybinary.exe中發生了'System.NullReferenceException'類型的未處理異常

附加信息:對象引用未設置為對象的實例。

如何在托管代碼中正確初始化struct數組元素?

編輯2:

嗨,還有一個問題,當我添加時,objData [i] .data_val3 [k] = randomData; // randomvalues,使用contnt值進行cfun_call時不更新,為什么?

您翻譯的結構不正確。 您需要像這樣:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct data
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
    public char[] data_val1;
    public float data_val2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
    public float[] data_val3;
};

您必須將其設為結構,因為您需要傳遞值數組。 使用類進行聲明會導致您傳遞引用數組。

您現在需要顯式初始化數組。 可能看起來像這樣:

data[] objData = new data[10];
for (int i = 0; i < 10; i++)
{
    objData[i].data_val1 = new char[100];
    objData[i].data_val2 = 0.00;
    objData[i].data_val3 = new float[50];
    for (int k = 0; k < 50; k++)
    {
        objData[i].data_val3[k] = 20.0f;
    }
 }

此外,C ++ long為32位寬,而C# long為64位寬。 因此,您不匹配。 您的p / invoke應為:

[DllImport("mycdll.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern void cfun_call(
    [In, Out] data[] ouputItem_data, 
    int count
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM