none
C++ typedef vs C# using的問題 RRS feed

  • 問題

  • Dear all

    請教各位一個問題

    不知道為什麼這樣寫有錯

    麻煩大家了~

    謝囉^^

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using BYTE = System.Byte;
    using char* = System.String;  <---不能這樣寫, 請問該怎麼修改呢?

    namespace Agilent_E6651A
    {
        static class Program
        {
            [DllImport("E6651_API.dll")]
            public static extern int E6651_Init(int PortNum);
            public static extern int E6651_GetSystemModel(BYTE MID, char* Value );
            public static extern int E6651_GetSystemVersion(BYTE MID, char* Value );

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

     

    2010年11月15日 上午 11:36

解答

  • 宣告改成這樣

    public static extern int E6651_GetSystemModel(BYTE MID, ref String Value);

    使用改成這樣

    iReturnValue = E6651_GetSystemModel(MID, ref SystemModel);



    夢想無限
    • 已標示為解答 陸雲 2010年11月17日 上午 09:29
    2010年11月16日 上午 06:13

所有回覆

  • 如果你要在C#用指標, 必須使用Unsafe Mode

    Unsafe 程式碼和指標 (C# 程式設計手冊)

    這個API看起來, 其實只要直接把型別改成String就行了吧, 用下面的方式改看看

      public static extern int E6651_GetSystemModel(BYTE MID, ref String Value );


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年11月15日 上午 11:51
    版主
  • C#的typedef可以用using語法模擬, 請參考:C# and typedef
    2010年11月16日 上午 02:35
  • Hi~2位

    根據大家的意見, 我後來改code成這樣,

    可是還是不行, 是為什麼?

    麻煩大家回覆了 謝謝囉:)

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using BYTE = System.Byte;

    namespace Agilent_E6651A
    {
        static class Program
        {
            [DllImport("E6651_API.dll")]
            public static extern int E6651_Init(int PortNum);
            public static extern int E6651_GetSystemModel(BYTE MID, String Value);
            public static extern int E6651_GetSystemVersion(BYTE MID, String Value);
            public static extern int E6651_RegisterMachine(BYTE MID, String IPAddr, int PortNum);
            public static extern int E6651_RemoteStart(BYTE MID);

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());

                Byte MID = 0;
                int iPortNum = 10000;
                int iReturnValue = 0;
                String SystemModel;
                String SystemVersion;

                iReturnValue = E6651_Init(10000);
                iReturnValue = E6651_RegisterMachine(MID, "192.168.1.100", iPortNum);
                iReturnValue = E6651_RemoteStart(MID);
                iReturnValue = E6651_GetSystemModel(MID, SystemModel);<----這行會出錯


            }
        }
    }

     error CS0165: Use of unassigned local variable 'SystemModel'

    2010年11月16日 上午 05:35
  • 宣告改成這樣

    public static extern int E6651_GetSystemModel(BYTE MID, ref String Value);

    使用改成這樣

    iReturnValue = E6651_GetSystemModel(MID, ref SystemModel);



    夢想無限
    • 已標示為解答 陸雲 2010年11月17日 上午 09:29
    2010年11月16日 上午 06:13
  • 原來是這樣 @@

    謝謝囉:D

    2010年11月17日 上午 09:28
  • 傳遞參數 (C# 程式設計手冊) 讀一讀吧

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