2013-05-28 78 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