2013-05-28 40 views
0

我在C代码中有3个全局变量:一个int和两个指向结构的指针。我必须将它们编组为C#代码中的公共静态成员,但我找不到任何解决方案。我必须提到修改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#代码中可用(已经封送)。

有没有人有一个解决方案编组全球或不可能的,我真的不得不把他们包装在一个结构或添加setters和getters到C代码?

+1

这是不可能的。不幸的是,你必须做你不想做的事情。 –

+1

@Mthethew这不是不可能的。 GetProcAddress解决了它。 –

+0

@DavidHeffernan很酷!我不知道!虽然ofc是不可能的。 –

回答

2

您可以使用GetProcAddress获取导出的全局变量的地址。您无法让编组人员使​​用DllImport进行编辑。

所以,你有两个选项:

  1. 使用GetProcAddress的和做的所有编组自己。
  2. 将getter和setter添加到C代码中,让编组人员从那里进行繁重的工作。

个人而言,我会选择选项2.

+0

感谢您的回答!我会选择二传手和二传手。使用GetProcAddress不是我的项目的选项。 – Andrei