c#中的Marshal全局变量

本文关键字:全局变量 Marshal 中的 | 更新日期: 2023-09-27 18:15:34

我在C代码中有3个全局变量:一个int和两个指向结构的指针。我必须在c#代码中将它们编组为公共静态成员,但我找不到任何解决方案。我必须提一下,修改C代码绝对是最后的选择。

我必须封送这个全局:

extern const    msdk_FileSystemInterface*       m_fileInterface;

这是我到目前为止尝试过的,但无法编译:

    [DllImport("foo.so", EntryPoint = "m_fileInterface")]
    private static extern IntPtr _m_fileInterface { get; set; }
    public static msdk_FileSystemInterface m_fileInterface 
    { 
        get
        {
            return (msdk_FileSystemInterface)Marshal.PtrToStructure(_m_fileInterface, typeof(msdk_FileSystemInterface));
        }
    }

.

    [DllImport("foo.so", EntryPoint = "m_fileInterface")]
    private static extern IntPtr _m_fileInterface;
    public static msdk_FileSystemInterface m_fileInterface 
    { 
        get
        {
            return (msdk_FileSystemInterface)Marshal.PtrToStructure(_m_fileInterface, typeof(msdk_FileSystemInterface));
        }
    }

msdk_FileSystemInterface结构在c#代码中可用(已经封送)。

有没有人有一个解决方案的封送全局变量或是不可能的,我真的必须把它们包装在一个结构体或添加setter和getter到C代码?

c#中的Marshal全局变量

可以使用GetProcAddress获取导出的全局变量的地址。您无法使用DllImport让编组程序执行此操作。

所以你的两个选择是:

  1. 使用GetProcAddress并自己完成所有的编组。
  2. 在C代码中添加getter和setter,并让编组程序从那里完成繁重的工作。

我个人会选择选项2