none
請問各位大大如何將C++寫的dll檔,在C#中應該如何引用靜態的方法? RRS feed

  • 問題

  • 請問各位大大如何將C++寫的dll檔,在C#中應該如何引用靜態的方法?
    小弟有一個DLL檔,可直接以[參考]的方式引用在C#中,結構如下:

    WD85.dll----- ct_drivce ----- CooltouchDevice ----- dll_CheckModel()
                 |
                 |     物件瀏覽器顯示: public int dll_CheckModel()
                 |                   ct_device.CooltouchDevice 的成員
                 |
                 ----- CoolTouchGUI ----- DotNetDll ----- set_DebugInterfaceOpen(bool)

                  物件瀏覽器顯示: public static void set_DebugInterfaceOpen(bool value)
                                         CoolTouchGUI.DotNetDll 的成員

    以上2個方法,dll_CheckModel()可以引用成功,但set_DebugInterfaceOpen(bool)確出現

    System.NullReferenceException
    並未將物件參考設定為物件的執行個體

    的錯誤訊息,請問各位大大我能用什麼方法才能成功的引用,謝謝~

    程式如下:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using ct_device;//Dll命名空間引用
    using System.Threading;

    namespace ReadTest1
    {

        public partial class Form1 : Form
        {
    CooltouchDevice API = new CooltouchDevice();

    public Form1()
            {
                InitializeComponent();
                ProcOpen();
            }

    void ProcOpen()
            {
    key = API.dll_CheckModel();//引用成功
    if (key != 0)
                {
    //check model 失敗
    }
    Thread.Sleep(100);

    CoolTouchGUI.DotNetDll.set_DebugInterfaceOpen(false);//錯誤發生
    }
        }
    }
    2016年12月1日 下午 12:49

解答

  • 這個 DLL 是廠商的吧 ? 提供者是誰 ? 有文件否 ?

    我猜想是在呼叫 CoolTouchGUI.DotNetDll.set_DebugInterfaceOpen  方法之前, 可能需要呼叫 API 中的其他方法. 另一個更可怕的可能性就是: 他的方法內容根本就寫錯了.

    所以我想光是這樣的資訊是解決不了問題的.


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


    2016年12月2日 上午 07:25
    版主

所有回覆

  • 這通常要先包裝成C函式的介面才能呼叫, 請參考:

    C# DllImport and Dllexport: DLL Interop - Dot Net Perls

    2016年12月2日 上午 07:11
  • 這個 DLL 是廠商的吧 ? 提供者是誰 ? 有文件否 ?

    我猜想是在呼叫 CoolTouchGUI.DotNetDll.set_DebugInterfaceOpen  方法之前, 可能需要呼叫 API 中的其他方法. 另一個更可怕的可能性就是: 他的方法內容根本就寫錯了.

    所以我想光是這樣的資訊是解決不了問題的.


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


    2016年12月2日 上午 07:25
    版主
  • tihs大大:

    我有試過您說的方法,但還是失敗,最後是Bill大大說的是OK的

    [DllImport(@"WD85.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_CheckModel@0")]
    static public extern int dll_CheckModel();

    [DllImport(@"WD85.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_set_DebugInterfaceOpen@4")]
    static public extern void set_DebugInterfaceOpen(bool value);

    非常感謝您的協助~~

    2016年12月4日 上午 04:52
  • Bill大大:

    謝謝您的指導,您說的完全正確,我照某順序執行後,就可以執行了

    廠商沒有給我文件,只有一個c++寫的範本

    謝謝您的指導~~

    2016年12月4日 上午 05:07
  • 幸好還有個 C++ Sample 可以看, 否則可能要拿你的 DLL  來拆解才會知道了.

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

    2016年12月4日 上午 05:23
    版主
  • Bill大大:

    C++我不熟~也是單步追踪很久,才有一點心得,廠商DLL我有用depends去拆解,但也是看不出來

    還好有大大的[一語驚醒夢中人]~光看VS IDE錯誤訊息真的是想都想不到~感謝~

    2016年12月4日 上午 11:32
  • 我猜測步驟是這樣子的.

    1.訊息是 "NullReferenceException", 那在呼叫這個方法中的某一段,應該有個東西要建立 Instance

    所以就會有兩條路

    2-1 要不就是先呼叫某個會建立該 Instance 的方法

    2-2 要不就是這個 Method 的內容有錯


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


    2016年12月5日 上午 12:28
    版主
  • Bill大大:

    原來是這樣的思維,謝謝您的指導

    2016年12月5日 上午 04:24