首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对调用C .DLL的C#结构进行编组的问题

对调用C .DLL的C#结构进行编组的问题
EN

Stack Overflow用户
提问于 2012-03-21 04:25:07
回答 1查看 257关注 0票数 2

我在尝试封送在C#程序中定义的结构时遇到了困难,该结构是调用我无法访问其源代码的非托管C .DLL文件所必需的。示例非托管C程序C程序可以毫无问题地调用此.DLL。问题结构是下面的fa_keylist。在我遇到问题的结构中包含了多个子结构:

从C头文件中:

代码语言:javascript
复制
struct fa_keypart {
    short kp_start;                      
    short kp_leng;                       
    long  kp_flags;                    
};


struct fa_keydesc {
    long  k_flags;                       
    long  k_nparts;                      
    struct fa_keypart k_part [FA_NPARTS];                                        
};


struct fa_keylist {
    long  kl_nkeys;                     
    char  kl_reserve[4];                
    struct fa_keydesc *kl_key [FA_NKEYS];
}

在C#中,我将其定义为:

代码语言:javascript
复制
    [StructLayout(LayoutKind.Sequential)]
    public struct fa_keypart
    {
        public Int16 kp_start;                            
        public Int16 kp_leng;                                       
        public Int32 kp_flags;                      
    }


    [StructLayout(LayoutKind.Sequential)]
    public struct fa_keydesc
    {
        public Int32 k_flags;                            
        public Int32 k_nparts;                                
        [MarshalAs(UnmanagedType.ByValArray)]
        public fa_keypart[] kparts;
    };


    [StructLayout(LayoutKind.Sequential)]
    public struct fa_keylist
    {
        public Int32 kl_nkeys;                                  
        public UInt32 kl_reserve;                              
        [MarshalAs(UnmanagedType.ByValArray)]
        public fa_keydesc[] kl_keys;    
    }

实际调用的DLLIMPORT签名定义为:

代码语言:javascript
复制
    [STAThread]
    [DllImport("F4AGFCFA.dll", EntryPoint = "cobfa_open", CallingConvention = CallingConvention.StdCall)]
    public static extern Int32 cobfa_open(
                        string fileName,
                        Int32 openFlags,
                        ref fa_keylist keyList,
                        Int32 recordLength);

对函数的调用编码为:

代码语言:javascript
复制
handle = cobfa_open(filename, fileFlags, ref keyList, 80);

顺便说一下,我已经尝试了许多不同的编组选项。我收到的当前错误是访问冲突(试图读取或写入受保护的内存)。

如有任何建议,我们将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-03-21 04:27:34

您需要指定数组的大小。假设C中的FA_NPARTS为128,您可以执行以下操作:

代码语言:javascript
复制
[StructLayout(LayoutKind.Sequential)]
public struct fa_keydesc
{
    public Int32 k_flags;                            
    public Int32 k_nparts;                                
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
    public fa_keypart[] kparts;
};

UnmanagedType.ByValArray也只能与SizeConst集一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9794347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档