将C结构导入C#程序

时间:2019-06-19 02:30:13

标签: c# c struct dllimport

结构

我不是C#或C程序员,也没有找到有关在结构中指定指针和结构的指导。我正在尝试将以下内容从C dll导入C#程序:

#define MAXFILENAME     259 

struct IDentry {
    char* IDname;
    int length;
};
typedef struct IDentry idEntry;


struct SMOutputAPI {
    char name[MAXFILENAME + 1];     
    FILE* file;                     

    struct IDentry *elementNames;   

    long Nperiods;                  
    int FlowUnits;                  

    int Nsubcatch;                  
    int Nnodes;                     
    int Nlinks;                     
    int Npolluts;                   

    int SubcatchVars;               
    int NodeVars;                   
    int LinkVars;                   
    int SysVars;                    

    double StartDate;               
    int    ReportStep;              

    __int64 IDPos;                  
    __int64 ObjPropPos;             
    __int64 ResultsPos;               
    __int64 BytesPerPeriod;           
};

我不确定如何处理*elementsNamesfilename属性。到目前为止,我在C#中拥有的是:

int MAXFILENAME = 259 

[StructLayout(LayoutKind.Sequential)]
public struct SMOutputAPI
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXFILENAME+1)]
    public string name;

    IntPtr file;

    IntPtr elementNames;

    public long Nperiods;   
    public int FlowUnits;   

    public int Nsubcatch;   
    public int Nnodes;      
    public int Nlinks;      
    public int Npolluts;    

    public int SubcatchVars;
    public int NodeVars;    
    public int LinkVars;    
    public int SysVars;     

    public double StartDate;
    public int ReportStep;  

    public int IDPos;       
    public int ObjPropPos;              
    public int ResultsPos;              
    public int BytesPerPeriod;          
};

C#应用程序构建良好,但是当我调用应返回新的SMOutputAPI结构的C初始化函数时,出现错误:

System.Runtime.InteropServices.MarshalDirectiveException 
Method's type signature is not PInvoke compatible. 

任何有关如何在C#中正确指定此结构的想法将不胜感激。谢谢!

初始化结构

使用以下代码在C代码中初始化结构:

SMOutputAPI* DLLEXPORT SMO_init(void)
//
//  Purpose: Returns an initialized pointer for the opaque SMOutputAPI
//    structure.
//
{
    SMOutputAPI *smoapi = malloc(sizeof(struct SMOutputAPI));
    smoapi->elementNames = NULL;

    return smoapi;
}

相应的c#代码为:

[DllImport("swmm-output.dll")]
static extern SMOutputAPI SMO_init();


static void Main(string[] args)
{
    Console.Write("Hello World!");

    SMOutputAPI SMO = SMO_init();
}

0 个答案:

没有答案