none
在c#中引用c++函式的問題 RRS feed

  • 問題

  • 客戶用C++寫了幾個函數

    int Open(unsigned short type, char* name);
    
    unsigned long getAmount(void);
    
    int GetValue(unsigned char* buf, int buffer_length);
    
    int Close(void);
    

    裏面的用途簡單來說是先open,再依傳入的type及name取得amount,再GetValue,再GetValue時會去做amount-1,最後再close。

     

    我在C#裏,這樣使用的

     

    public class TestApi 
    {
    
    [DllImport("api.dll")]
    private static extern int Open(ushort type, string name);
    
    [DllImport("api.dll")]
    private static extern UInt32 getAmount();
    
    [DllImport("api.dll")]
    private static extern int GetValue(byte[] key_buf, int key_buf_length);
    
    [DllImport("api.dll")]
    private static extern int Close();
    
    public int TestOpen(ushort type, string name)
    {
       return Open(type,name);
    }
    
    public UInt32 TestGetAmount()
    {
       return GetAmount();
    }
    
    
    public string TestGetValue(ref string strTest)
    {
       int length =1024;
       byte[] buf = new byte[length];
       int result = GetValue(buf, length);
       // ....將buf轉成字串
       strTest = BufferToString(buf);
       return result();
    }
    
    
    public int TestClose()
    {
       return Close();
    }
    }
    
    public class TestRun
    {
       public void Run()
       {
          TestApi test = new TestApi();
          test.Open(1,'aaa');
          int amount = test.TestGetAmount();  Console.WriteLine(amount.toString());
          for (int i=0;i<10;i++)
          {
             string str="";
             test.TestGetValue(ref str);
          }
          test.Close();  test = null;
       }
    }
    

     


    現在的問題是,我想要每次執行Run結束, TestApi都能正確的完整的釋放掉資源。

    例如 我第一次執行Run,GetAmount的結果是 100

    只要我有執行Close的動作,下一次再執行GetAmount 應該還是初始100。

    可是我執行的結果是

    TestRun();   -->  100

    TestRun();   --> 90

     

    如果我整個程式關掉再重新執行一次

    又會回到

     

    TestRun();   -->  100

    TestRun();   --> 90

    我想要的是

     

     

    TestRun();   -->  100

    TestRun();   -->  100

    就是每次執行TestRun的結果都跟第一次一樣。

     

    我有試過把TestApi繼承IDispose,然後用Using的方式去引用TestApi,結果還是一樣。

    請問該如何做?

     

     

     


    2011年9月2日 上午 07:20

解答

  • 這個, 建不建立執行個體根本不會有差, 基本上P/Invoke的函式是宣告為static, 也就是靜態的, 所以和你的 test object其實無關.

    如果要釋放資源, 可能要請寫 API的人去寫才對.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2011年9月4日 下午 05:53
    版主