日期:2014-05-18  浏览次数:21139 次

c#引用DLL,尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
最近在对华视电子的二代身份证读卡器进行二次开发。调用里面的termb.dll,代码如下:

//源程序说明文件中对函数的说明
4.1 初始化连接
原 型:int CVR_InitComm (int Port)
说 明:本函数用于PC与华视电子第二代居民身份证阅读器的连接。
参 数:Port:连接串口或USB口
值 意义
1 串口1
2 串口2
3 串口3
4 串口4
1001 USB口1
1002 USB口2
1003 USB口3
1004 USB口4

返 回 值: 意义
1 正确
0 错误

//申明部分
[DllImport("termb.dll")]
private static extern int CVR_InitComm(int Port);

//调用部分(判断读卡器是否连接到计算机)
 public static bool InitComm()
{
   
  if ((CVR_InitComm(1001)==1)||(CVR_InitComm(1002)==1)
  ||(CVR_InitComm(1003)==1)||(CVR_InitComm(1004)==1))
  {
  return true;
  }
  else
  {
  return false;
  }  
 }
google了好久,也没找到合适的方法。希望这里能找到解决方案。

------解决方案--------------------
出现这种情况是 传给Dll的参数类型有问题改成下面的看看:

C# code

[DllImport("termb.dll")] 
private static extern int CVR_InitComm(Int32 Port); 

或

[DllImport("termb.dll", EntryPoint = "CVR_InitComm"))]  
private static extern int CVR_InitComm(Int32 Port);

------解决方案--------------------
估计是CVR_InitComm内部抛出了异常,用下面的代码确认一下...
C# code

[DllImport("termb.dll")]
        private static extern int CVR_InitComm(int Port);

        public static bool InitComm() {
            bool result = false;
            try {
                if ((CVR_InitComm(1001) == 1) || (CVR_InitComm(1002) == 1)
                    || (CVR_InitComm(1003) == 1) || (CVR_InitComm(1004) == 1)) {
                    result = true;
                }
            } catch (SEHException ex) {
                Console.WriteLine("Unknow error occurred in the call to CVR_InitComm(...)");
            }
            return result;
        }

------解决方案--------------------
顶一下 接分
------解决方案--------------------
曾经遇到过,我的问题是传入的参数类型不一直造成的
------解决方案--------------------
楼上的

C# code
[DllImport("termb.dll")] 
private static extern int CVR_InitComm(int Port);

------解决方案--------------------
一般都是参数不对应



------解决方案--------------------
你的错误提示 是参数不正确造成的。.你看下说明确定这个方法 只是 int 一个参数?
------解决方案--------------------
C# code


//依vb6的声明,c#对应的应该是这样

[DllImport("termb.dll")] 
private static extern Int16 CVR_InitComm(Int32  Port);