.NET 调用第三方DLL 报错

zkvistor 2011-04-20 06:06:47
报错:

无法加载 DLL“zmdata.dll”: 内存位置访问无效


[DllImport("zmdata.dll", CharSet = CharSet.Auto, EntryPoint = "GetMD5")
public static extern string GetMD5(ref string sSource);


...全文
638 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
之苒 2011-06-10
  • 打赏
  • 举报
回复
将dll的路径写为绝对路径,我就是这样做的。
zkvistor 2011-04-26
  • 打赏
  • 举报
回复
试了一下 ,DLL 里有一个方法是ulong 对应 C#的 uint ,在项目里申明为uint 改了后还是抱错:


引发类型为“System.ExecutionEngineException”的异常。或

调用的目标发生了异常
zkvistor 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 pathuang68 的回复:]
都是DLL,但非托管的DLL调用,需要用PInvoke才可以。
去看看PInvoke吧。
[/Quote]

初步判定 是由于 C++ 和 C#中 数据类型不一致造成的 ,同样的long 在C++ 和 c#中对应长度不一样
zkvistor 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhouyuqwert 的回复:]
.net反编译试试
[/Quote]

这个 DLL 反编译不了,楼上图片忒搞笑 ,哈哈哈。。
pathuang68 2011-04-25
  • 打赏
  • 举报
回复
都是DLL,但非托管的DLL调用,需要用PInvoke才可以。
去看看PInvoke吧。
阳明 to life 2011-04-24
  • 打赏
  • 举报
回复
mb_1985 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxr0323 的回复:]
哥啊 你就在BIN文件夹下右键引用 然后选择那个DLL。确定

页面using DLL名字 就可以了
[/Quote]
哥啊,人家不是.net或者COM+的Dll 没法引用的...
zkvistor 2011-04-24
  • 打赏
  • 举报
回复
今天决定去图书馆查资料,如何把这个杯具 变成 洗具
zkvistor 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 x363961461 的回复:]

C# code

public class Win32 {

public const Int32 AW_HOR_POSITIVE = 0x00000001;

public const Int32 AW_HOR_NEGATIVE = 0x00000002;

public const Int32 AW_VER_POSITIVE = 0x……
[/Quote]


啥意思??
zkvistor 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaogug01 的回复:]

引用 11 楼 downmoon 的回复:

MD5加密方案有很多,必须要用该dll吗?
如果你一定要用,可以跟踪调试,如果跟不进去,而没有源码,建议放弃使用。


+ 如果调不进去,又没源码,还是放弃吧。
[/Quote]

不能放弃,否则功能就实现不了,指定要用这个,哥真的是一个杯具

能用其他 我早放弃了
x363961461 2011-04-22
  • 打赏
  • 举报
回复

public class Win32 {

public const Int32 AW_HOR_POSITIVE = 0x00000001;

public const Int32 AW_HOR_NEGATIVE = 0x00000002;

public const Int32 AW_VER_POSITIVE = 0x00000004;

public const Int32 AW_VER_NEGATIVE = 0x00000008;

public const Int32 AW_CENTER = 0x00000010;

public const Int32 AW_HIDE = 0x00010000;

public const Int32 AW_ACTIVATE = 0x00020000;

public const Int32 AW_SLIDE = 0x00040000;

public const Int32 AW_BLEND = 0x00080000;

[DllImport("user32.dll", CharSet = CharSet.Auto)]

public static extern bool AnimateWindow(

IntPtr hwnd, // handle to window

int dwTime, // duration of animation

int dwFlags // animation type

);

[DllImport("user32.dll", CharSet = CharSet.Auto)]

public static extern bool SetWindowPos(

IntPtr hwnd,

int hWndInsertAfter,

int x,

int y,

int cx,

int cy,

int wFlags

);
}

xiaogug01 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 downmoon 的回复:]

MD5加密方案有很多,必须要用该dll吗?
如果你一定要用,可以跟踪调试,如果跟不进去,而没有源码,建议放弃使用。
[/Quote]

+ 如果调不进去,又没源码,还是放弃吧。
downmoon 2011-04-22
  • 打赏
  • 举报
回复
MD5加密方案有很多,必须要用该dll吗?
如果你一定要用,可以跟踪调试,如果跟不进去,而没有源码,建议放弃使用。
zkvistor 2011-04-21
  • 打赏
  • 举报
回复
现在貌似可以正常调用,但是得不到返回值,

public static extern string GetMD5(ref string sSource);(DLL 中MD5加密)

传进去 和 返回的sSource 是一样的,程序也没有报错,

代码如下:


using public void UnLoadDll()
{
FreeLibrary(hModule);
hModule = IntPtr.Zero;
farProc = IntPtr.Zero;
} /// <summary>
/// 调用所设定的函数
/// </summary>
/// <param name="ObjArray_Parameter"> 实参 </param>
/// <param name="TypeArray_ParameterType"> 实参类型 </param>
/// <param name="ModePassArray_Parameter"> 实参传送方式 </param>
/// <param name="Type_Return"> 返回类型 </param>
/// < returns> 返回所调用函数的 object< /returns>
public object Invoke(object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
{
// 安全检查 , 若不能通过 , 则抛出异常
if (hModule == IntPtr.Zero)
throw (new Exception(" 函数库模块的句柄为空 , 请确保已进行 LoadDll 操作 !")); if (farProc == IntPtr.Zero)
throw (new Exception(" 函数指针为空 , 请确保已进行 LoadFun 操作 !")); if (ObjArray_Parameter.Length != ModePassArray_Parameter.Length)
throw (new Exception(" 参数个数及其传递方式的个数不匹配 .")); // 创建 MyAssemblyName 对象并设置其 Name 属性
AssemblyName MyAssemblyName = new AssemblyName();
MyAssemblyName.Name = "InvokeFun"; // 生成单模块配件
AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("InvokeDll"); // 定义要调用的方法 , 方法名为“ pro_update ”,返回类型是“ Type_Return ”参数类型是“ TypeArray_ParameterType ”
MethodBuilder MyMethodBuilder = MyModuleBuilder.DefineGlobalMethod("pro_update", MethodAttributes.Public | MethodAttributes.Static, Type_Return, TypeArray_ParameterType);

// 获取一个 ILGenerator ,用于发送所需的 IL
ILGenerator IL = MyMethodBuilder.GetILGenerator();
int i; for (i = 0; i < ObjArray_Parameter.Length; i++)
{
// 用循环将参数依次压入堆栈
switch (ModePassArray_Parameter[i])
{ case ModePass.ByValue:
IL.Emit(OpCodes.Ldarg, i);
break; case ModePass.ByRef:
IL.Emit(OpCodes.Ldarga, i);
break; default:
throw (new Exception(" 第 " + (i + 1).ToString() + " 个参数没有给定正确的传递方式 .")); }
} if (IntPtr.Size == 4)
{
// 判断处理器类型
IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());
}
else if (IntPtr.Size == 8)
{
IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());
}
else
{
throw new PlatformNotSupportedException();
} IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, TypeArray_ParameterType);
IL.Emit(OpCodes.Ret); // 返回值
MyModuleBuilder.CreateGlobalFunctions(); // 取得方法信息
MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("pro_update"); // 调用方法,并返回其值
return MyMethodInfo.Invoke(null, ObjArray_Parameter);
} /// 调用方法: #region 直接解压RAR到当前目录
/// <summary>
/// 直接解压RAR到当前目录
/// </summary>
/// <param name="unZipFile">需要解压的文件</param>
/// <param name="appFile">自解压后调用的程序</param>
/// <returns>1-自解压成功;否则失败</returns>
private int SelfUnZip(string unZipFile, string appFile)
{
DllClass zipDll = new DllClass();
zipDll.LoadDll("ZMSOFT.dll");
zipDll.LoadFun("pro_update");
string descDir = Application.StartupPath; if (!descDir.EndsWith("\\"))
descDir += "\\"; object[] Parameters = new object[] { unZipFile, descDir, descDir + appFile, null }; // 实参为0
Type[] ParameterTypes = new Type[] { typeof(string), typeof(string), typeof(string), typeof(long) }; // 实参类型为int
ModePass[] themode = new ModePass[] { ModePass.ByValue, ModePass.ByValue, ModePass.ByValue, ModePass.ByValue }; // 传送方式为值传
Type Type_Return = typeof(int); // 返回类型为int return (int)zipDll.Invoke(Parameters, ParameterTypes, themode, Type_Return);
} }
}



lic static string zmencode(string str, string key, ref string outstr)
{
string ls_key = "770814"; key = ls_key; //DesEnCodeHex(str, key,ref outstr); LoadDLL objLoad = new LoadDLL();
objLoad.LoadDll("zm_2007.dll");
objLoad.LoadFun("DesEnCodeHex"); string desDir = @"C:\Windows\System32\zm_2007.dll";
if (!desDir.EndsWith("\\"))
desDir += "\\"; //参数
object[] Parameters = new object[] {str,ls_key,outstr}; //参数类型
Type[] ParmeterTypes = new Type[] { typeof(string), typeof(string), typeof(string)}; //参数传送方式
ModePass[] TransMode = new ModePass[] { ModePass.ByValue, ModePass.ByValue, ModePass.ByRef}; //返回类型 为string
Type returnType = typeof(long);
objLoad.Invoke(Parameters, ParmeterTypes, TransMode, returnType, "DesEnCodeHex"); return outstr.Trim();
}

private static string of_getmd5(string strSource)
{
string ls_in = "";
ls_in = "icansaymyabc" + strSource + "123321";

// string jmStr = Md5JiaMi(ls_in); return JieQuString(Md5JiaMi(ls_in), 8, "right");
} private static string Md5JiaMi(string pwd)
{
// E:\SAASProject\Web\bin LoadDLL objLoad = new LoadDLL();
objLoad.LoadDll("zmdata.dll");
objLoad.LoadFun("GetMD5Str"); string desDir = @"C:\Windows\System32\zmdata.dll";
if (!desDir.EndsWith("\\"))
desDir += "\\"; //参数
object[] Parameters = new object[] { pwd, desDir }; //参数类型
Type[] ParmeterTypes = new Type[] { typeof(string), typeof(string) }; //参数传送方式
ModePass[] TransMode = new ModePass[] { ModePass.ByValue, ModePass.ByValue }; //返回类型 为string
Type returnType = typeof(string); return (string)objLoad.Invoke(Parameters, ParmeterTypes, TransMode, returnType, "GetMD5Str");
}


zkvistor 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fengyarongaa 的回复:]
引用 2 楼 wxr0323 的回复:

哥啊 你就在BIN文件夹下右键引用 然后选择那个DLL。确定

页面using DLL名字 就可以了


不行就这样试试 [DllImport("zmdata.dll", CharSet = CharSet.Auto, EntryPoint = "GetMD5")
[/Quote]

试过了不行, 现在总提示找不到该DLL ,我在ASP.NET 的源码的BIN 文件夹 和 system32下都拷贝有
zkvistor 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kiba518 的回复:]
有时候 就是DLL不行 换一个DLL试试 你试试调用SYSTEM32里面别的DLL 可以调用的话 那就是哪个c++编写的DLL有问题
[/Quote]

这个DLL 在PB 程序里可以正常使用,具体用什么编写的不详
kiba518 2011-04-21
  • 打赏
  • 举报
回复
有时候 就是DLL不行 换一个DLL试试 你试试调用SYSTEM32里面别的DLL 可以调用的话 那就是哪个c++编写的DLL有问题
ycproc 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxr0323 的回复:]

哥啊 你就在BIN文件夹下右键引用 然后选择那个DLL。确定

页面using DLL名字 就可以了
[/Quote]

不行就这样试试 [DllImport("zmdata.dll", CharSet = CharSet.Auto, EntryPoint = "GetMD5")
zkvistor 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxr0323 的回复:]
哥啊 你就在BIN文件夹下右键引用 然后选择那个DLL。确定

页面using DLL名字 就可以了
[/Quote]

兄弟,这个是第三方非托管的DLL ,那样引用不了的 ,早就试过
wangchangming 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zkvistor 的回复:]
什么原因? 网上查了一下说:DLL 位置放错了,项目源码bin 目录 和 system32 都放了
[/Quote]
放bin或System32下面没错
如果是C++动态库,试着把mfc42.dll等几个一起加到下面
加载更多回复(3)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧