gpt4 book ai didi

c# - 如何从C#中的特定路径读取dll

转载 作者:行者123 更新时间:2023-11-30 14:24:32 25 4
gpt4 key购买 nike

我需要将 SglW32.dll 导入我的解决方案。

但是我得到:

AccessViolation exeption : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

我不能只使用 DllImport。在这种情况下,找不到 dll。

这是完整的例子。

using System;
using System.Runtime.InteropServices;
namespace TestDllimport
{
class Program
{
static void Main(string[] args)
{
var a = new MyClass();
var result = a.getValue();
}
}
class FunctionLoader
{
[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);

[DllImport("Kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

public static Delegate LoadFunction<T>(string dllPath, string functionName)
{
var hModule = LoadLibrary(dllPath);
var functionAddress = GetProcAddress(hModule, functionName);
return Marshal.GetDelegateForFunctionPointer(functionAddress, typeof(T));
}
}

public class MyClass
{
//Define your path to dll.
//Get dll from: http://www.sg-lock.com/download/sglw32_v2_28.zip
private const string DLL_Path = @"C:\Users\admin123\Desktop\MyDlls\SglW32.dll";

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate ulong SglAuthentA(IntPtr AuthentCode);
static MyClass()
{
sglAuthentA = (SglAuthentA)FunctionLoader.LoadFunction<SglAuthentA>(DLL_Path, "SglAuthentA");
}

static private SglAuthentA sglAuthentA;

unsafe public ulong getValue()
{
IntPtr d = new IntPtr(5);
var a1 = sglAuthentA(d); // Exception IS HERE !!!!!
return a1;
}
}
}

我正在使用加载函数从任何路径获取 dll。之后,我从所需的功能中创建委托(delegate)。在我的例子中,函数是 SglAuthentA。此解决方案适用于另一个 dll,但不适用于 SglW32.dll。

产品:http://www.sg-lock.com/us/

所需的 dll:http://www.sg-lock.com/download/sglw32_v2_28.zip

手册:http://www.sg-lock.com/download/SG-Lock_Manual_Eng.pdf

来源 1:https://stackoverflow.com/a/8836228/2451446


编辑:感谢 Hans Passant 回答和 ja72 评论


See How to import dll

using System.Runtime.InteropServices;

namespace TestDllimport
{
class Program
{
static void Main(string[] args)
{
var testA = DllImportClass.SglAuthentA(new uint[] { 5, 6, 7 }, new uint[] { 5, 6, 7 }, new uint[] { 5, 6, 7 });
var testB = DllImportClass.SglAuthentB(new uint[] { 5, 6, 7 });
}
}

static class DllImportClass
{
[DllImport("SglW32.dll")]
public static extern uint SglAuthentA(uint[] AuthentCode0, uint[] AuthentCode1, uint[] AuthentCode2);

[DllImport("SglW32.dll")]
public static extern uint SglAuthentB(uint[] AuthentCode);
}

}

最佳答案

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate ulong SglAuthentA(IntPtr AuthentCode);

委托(delegate)声明不正确,与 api 函数签名不匹配。 C 中的 ULONG 是 C# 中的 uint。 C 中的 ULONG* 是不明确的,可能是 ref uint 也可能是 uint[]。因为您应该传递一个 48 字节的验证码,所以您知道它是一个数组。修复:

private delegate uint SglAuthentA(uint[] authentCode);

一定要传递正确的验证码。它不是 5,数组必须有 12 个元素。如果您没有,请调用制造商购买。


private const string DLL_Path = @"C:\Users\admin123\Desktop\MyDlls\SglW32.dll";

请注意,这不是无法使用 [DllImport] 的解决方法。硬编码路径是一个问题,该文件不会出现在用户机器上的那个目录中。 DLL 本身没有任何阻止它加载的依赖项,出现问题的唯一可能原因是您只是忘记将 DLL 复制到正确的位置。只有一个这样的地方,与您的 EXE 相同的目录。

以正确的方式修复此问题,使用“项目”>“添加现有项”> 选择 DLL。在“解决方案资源管理器”窗口中选择添加的文件。在“属性”窗口中,将“复制到输出目录”设置更改为“如果更新则复制”。重建您的项目并注意您现在将在项目的 bin\Debug 目录中获得 DLL。现在 [DllImport] 可以工作了。


手册的注意事项,它列出了 Visual Basic 中的代码示例。这通常是您通常用作学习如何使用 api 的指南。然而,该代码不是 VB.NET 代码,它是 VB6 代码。在示例代码中看到 Long 的地方,您应该改用 uintint

很马虎,给产品质量打了个大大的问号。他们似乎根本没有解决的其他问题是如何确保您自己的代码安全。使用加密狗时非常重要。请注意,任何人都可以轻松地对您的身份验证代码进行逆向工程。更糟糕的是,反编译您的程序并删除身份验证检查。您需要使用混淆器。

关于c# - 如何从C#中的特定路径读取dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40807142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com