尝试导入非托管dll时Pinvoke“System.AccessViolationException”

时间:2014-02-12 20:11:07

标签: c# c

我正在尝试为我公司使用的设备导入驱动程序DLL,但我似乎无法让它工作。我是c#的新手,所以请放轻松我。这与我昨天发布的帖子有关,我试图将C程序转换为C#。

我编写了这段代码,以便我可以开始理解PInvoke

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace PInvokeTest {
  class Program {
    static void Main(string[] args) {
        Int32 session_handle = 0;
        Byte state_buffer = 0;
        Int16 result = 1, PortNum = 1, PortType = 1;

        session_handle = TMExtendedStartSession(PortNum, PortType);

        result = TMSearch(session_handle, state_buffer, 1, 1, 0xEC);

        if (result == 1)
            Console.WriteLine("Device Found");

        if (result == -201)
            Console.WriteLine("Hardware Driver Not Found");

        else
            Console.WriteLine("Network Error");



        Console.ReadKey();
    }
    [DllImport("IBFS32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    public static extern Int32 TMExtendedStartSession(Int16 PortNum, Int16 PortType);

    [DllImport("IBFS32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    public static extern Int16 TMSearch(Int32 session_handle, Byte state_buffer, int p1, int p2, int p3);  

  }
}

我正在尝试使用这两个功能

TMExthendedStartSession http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/exst8l9q.html

和TMSearch http://files.maximintegrated.com/sia_bu/licensed/docs/1-wire_sdk_win/TMEX/sear1ezy.html

当我运行TMExthendedStartSession时,我得到System.AccessViolationException,但是当我单独运行TMSearch时,我收到一条消息 " 托管调试助手' PInvokeStackImbalance'已在C:\ PInvokeTest \ Debug \ PInvokeTest.vshost.exe' 中检测到问题。"

函数TMSearch确实返回值-201。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在32位Windows中,pascal调用约定映射到stdcall。 #define(或更现代的SDK中的WinDef.h)顶部附近有一个minwindef.h,可将pascal映射到__stdcall

最重要的是,你的参数都错了。它应该是这样的:

[DllImport("IBFS32.dll")]
public static extern int TMExtendedStartSession(
    short PortNum, 
    short PortType,
    IntPtr EnhancedOptions 
);

[DllImport("IBFS32.dll")]
public static extern short TMSearch(
    int session_handle, 
    IntPtr state_buffer, 
    short p1, 
    short p2, 
    short p3
);  

state_buffer参数可能更好地声明为byte[]。从这里很难说出语义是什么。