求助,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
[解决办法]
第三方动态库出的问题,
检查第三方动态库所需文件是否齐全,
手工安装第三方动态库,先测试其是否可工作。
[解决办法]
若是在开发机器上执行下来的结果不一样,那多半是工作目录或权限之类的问题。试一下以管理员权限启动。
[解决办法]
这个错误应该是调用dll的问题,一般是参数不匹配,调用约定不匹配等
[解决办法]
发现一个问题,ref string是不允许使用的,string你给的是空字符串,在.NET里面字符串是不可变的对象,因此内存操作失败。你可以用StringBuilder替代string。
[解决办法]
最后一个参数像是二维字符串数组,不能搞string吧
你搞个数组试试
[解决办法]
char ** v2c
等价于C#的byte[]
你先定义一个byte[],给定一个足够大的容量,例如byte[1024],确保返回的字符串能装得下,然后用Endocing.Ascii转换到指定字符串上,当然前提是那个参数肯定是返回的字符串。
至于你之前使用的STRING ,STRINGBUILD都有可能会导致预先分配的内存不够C++指针访问,在你调试的时候访问到内存外部似乎不会有异常,但是执行的时候就是非法访问非程序内存块了。你必须让C++的char ** 可以有足够大的内存范围移动它的指针,超出你原先给定的内存范围就是“尝试读取或写入受保护的内存”