none
C#中DllImport 函數呼叫 RRS feed

  • 問題

  • 向大家請教一些問題,
    其實我還是不太了解要如何才能讓一個function在多個.cs中被呼叫,是只要using進來可以嗎?

    還是namespace要相同才可以?

    情況是這樣的,手上拿到對方給的dll檔,也另開了一個imitatePacket.cs和Form1.cs,

    在imitatePacket.cs中將此dll import進來,

    imitatePacket.cs程式碼如下:      

    namespace imitatePacket
    {
        public class imPacket
        {
            [DllImport("Bus.dll", EntryPoint = "bus_GetNumDevices", CallingConvention = CallingConvention.StdCall)]
            public static extern BUS_STATUS Bus_GetDevices(ref uint numofDevices, ushort vid, ushort pid);

            public static BUS_STATUS Result = BUS_STATUS.BUS_DEVICE_ACCESS_ERROR;

            public static bool API_GetDevices(ushort vid, ushort pid)
            {
                uint numDevices = 0;
                Result = bus_GetDevices(ref numDevices, vid, pid);
                if (Result == BUS_STATUS.BUS_SUCCESS)
                {
                    return true;
                }
                else
                {
                    return false;
                }
             }
        }
    }

    ==========================================

    接下來要在Form1.cs中呼叫在imitatePeckte.cs中dll import進來的function,

    這時候要先加入using imitatePacket;

    但在Form1.cs中呼叫imitatePacket.cs中的class imPacket中的成員API_GetDevices依然是出現錯誤的訊息。

    Form1.cs的程式碼如下

    using imitatePacket;

    namespace formosa
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            ushort uvid=4292, upid=60048;        
      
            imPacket.API_GetDevices(uvid, upid);//未能成功呼叫

         }

    }

    ======================================

    請問大家我是在哪個地方做錯或是沒有注意到呢?

    是要把imitatePacket.cs中的namespace改成跟Form1.cs一樣的formosa呢?

    還是只要在Form1.cs中加入using imitatePacket;才對呢?


    • 已編輯 dahliax44 2013年7月22日 上午 03:34
    2013年7月22日 上午 03:15

解答

  • public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            ushort uvid=4292, upid=60048;        
      
            imPacket.API_GetDevices(uvid, upid);// <--- 不在任何一個 function 區塊 不能直接呼叫 

         }

    請將該行程式移到適當的地方


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 dahliax44 2013年7月30日 上午 03:54
    2013年7月23日 上午 05:42
  • 1.您可以建立[類別庫]型態的專案, 專案中的功能就可以被多個程式所呼叫了

    2.兩種做法都可以

    • 已標示為解答 dahliax44 2013年7月30日 上午 03:54
    2013年7月22日 上午 05:34

所有回覆

  • 1.您可以建立[類別庫]型態的專案, 專案中的功能就可以被多個程式所呼叫了

    2.兩種做法都可以

    • 已標示為解答 dahliax44 2013年7月30日 上午 03:54
    2013年7月22日 上午 05:34
  • tihs你好

    請問你的意思是先建立ClassLibrary型態的專案,

    在ClassLibrary型態的專案裡把dll import進來,然後在Form1.cs中呼叫使用嗎?

    2013年7月22日 上午 07:47
  • 錯誤訊息該不會是 BUS_STATUS 沒定義之類的吧?

    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2013年7月22日 上午 11:18
  • Alex_Lee謝謝你的回覆 :)

    BUS_STATUS我有在另外bulk.cs中定義了,也有在Form1.cs中using進來,並且在Form1.cs中也能使用BUS_STATUS。

    錯誤的訊息是在這行 imPacket.API_GetDevices(uvid, upid);//未能成功呼叫 ,

    出現三個Invalid token '(' ',' ')',猜測是在imPacket這個class後找不到成員函數所造成。

    還希望各位前輩們能幫忙解答,謝謝。

    2013年7月23日 上午 01:31
  • public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            ushort uvid=4292, upid=60048;        
      
            imPacket.API_GetDevices(uvid, upid);// <--- 不在任何一個 function 區塊 不能直接呼叫 

         }

    請將該行程式移到適當的地方


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    • 已標示為解答 dahliax44 2013年7月30日 上午 03:54
    2013年7月23日 上午 05:42
  • 是把要提供給多個.cs檔案使用的類別製作在類別庫專案中, 再被其他的專案import使用
    2013年7月23日 上午 05:46