读书人

winform 安装包 UNSAFE代码块无效

发布时间: 2013-11-21 23:38:25 作者: rapoo

求助,winform 安装包 UNSAFE代码块无效
案例描述:

使用c#开发一个WINFORM应用,目的是生成计算机硬件指纹,
使用到第三方提供的动态库组件,包含若干DLL,

供应商提供接口如下,其中UNSAFE关键字是我自己加上去的,项目生成属性里也设置了允许执行不安全的代码。

一:定义导入动态库
[DllImport("hasp_act_windows.dll", CharSet = CharSet.Ansi, EntryPoint = "hasp_act_activate")]
public unsafe static extern uint hasp_act_activate(int handle, string c2v, string product_key, ref string v2c);

二:调用接口
public uint hasp_act_activate(string c2v, string product_key, ref string v2c)
{
uint status = 0;
v2c = " ";
try
{
unsafe
{
status = HaspActivation.hasp_act_activate(this.handle, c2v, product_key, ref v2c);
}
}
catch (System.DllNotFoundException)
{
throw new System.DllNotFoundException(strError);
}

return status;
}

三:调用
string v2c = " ";
unsafe
{
state = act.hasp_act_activate(c2v, productKey, ref v2c);
}


问题来了:
在VS2010里直接F5调试,无论是在DEBUG或者release模式下均可正常运行,
可是在项目物理目录下直接运行DEBUG或者RELEASE下的项目.exe文件则抛出个异常,
System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
在 HaspActivation.hasp_act_activate(Int32 handle, String c2v, String product_key, String& v2c)
制作出来的安装包也出现如上错误。

本人在GOOGLE,百度,BING下搜了几天解决方案无果,甚至在Program.cs里把MAIN函数也加上UNSAFE,可依旧无效,还报一线希望在这里向各位师傅求教下,看看各位有无解决方案指点一二,多谢大家的帮助。 WINFORM? unsafe
[解决办法]
第三方动态库出的问题,

检查第三方动态库所需文件是否齐全,
手工安装第三方动态库,先测试其是否可工作。
[解决办法]

引用:
Quote: 引用:

第三方动态库出的问题,

检查第三方动态库所需文件是否齐全,
手工安装第三方动态库,先测试其是否可工作。


应该齐全的,把那些所需的动态库文件全部复制在DEBUG和RELEASE目录下,在VS2010里运行能够正常通过,可是在目录里点击生成的EXE文件则出现如上错误。

每次DEBUG或者RELEASE后,在其相应目录里都会生成个EXE,可是点这个生成文件却和直接F5执行下来的结果不一样。。。。


若是在开发机器上执行下来的结果不一样,那多半是工作目录或权限之类的问题。试一下以管理员权限启动。

[解决办法]
这个错误应该是调用dll的问题,一般是参数不匹配,调用约定不匹配等
[解决办法]
发现一个问题,ref string是不允许使用的,string你给的是空字符串,在.NET里面字符串是不可变的对象,因此内存操作失败。你可以用StringBuilder替代string。
[解决办法]
最后一个参数像是二维字符串数组,不能搞string吧
你搞个数组试试
[解决办法]
char ** v2c
等价于C#的byte[]
你先定义一个byte[],给定一个足够大的容量,例如byte[1024],确保返回的字符串能装得下,然后用Endocing.Ascii转换到指定字符串上,当然前提是那个参数肯定是返回的字符串。

至于你之前使用的STRING ,STRINGBUILD都有可能会导致预先分配的内存不够C++指针访问,在你调试的时候访问到内存外部似乎不会有异常,但是执行的时候就是非法访问非程序内存块了。你必须让C++的char ** 可以有足够大的内存范围移动它的指针,超出你原先给定的内存范围就是“尝试读取或写入受保护的内存”

读书人网 >C#

热点推荐