Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中封送全局变量#_C#_C_Pinvoke_Marshalling - Fatal编程技术网

C# 在C中封送全局变量#

C# 在C中封送全局变量#,c#,c,pinvoke,marshalling,C#,C,Pinvoke,Marshalling,我在C代码中有3个全局变量:一个int和两个指向结构的指针。我必须在C代码中将它们作为公共静态成员封送,但我找不到任何解决方案。我必须提到,修改C代码是绝对的最后一个选项 我必须整理这个全球: extern const msdk_FileSystemInterface* m_fileInterface; 这是我到目前为止尝试过的,但没有编译: [DllImport("foo.so", EntryPoint = "m_fileInterface")] priva

我在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));
        }
    }

msdk#U文件系统接口结构在C#代码中可用(已封送)


是否有人有marsahalling全局变量的解决方案,或者说这是不可能的,我真的必须将它们包装在一个结构中,或者将setter和getter添加到C代码中?

您可以使用GetProcAddress获取导出全局变量的地址。您无法让封送员使用DllImport执行此操作

因此,您的两个选择是:

  • 使用GetProcAddress并自己进行所有编组
  • 将getter和setter添加到C代码中,让封送员从那里完成繁重的工作

  • 就个人而言,我会选择选项2。

    这是不可能的。不幸的是,你不得不做你不想做的事。@Matthew这不是不可能的。GetProcAddress解决了这个问题。@DavidHeffernan噢,太酷了!我不知道!虽然ofc无法处理它。谢谢你的回答!我会选择二传手和二传手。使用GetProcAddress不是我的项目的选项。
        [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));
            }
        }