martin_tang 2022-10-24 14:17 采纳率: 0%
浏览 89
已结题

64位C#程序,使用LoadLibrary调用64位的dll失败

64位C#程序,使用LoadLibrary调用64位的C++编写的dll,失败

用代码块功能插入代码,请勿粘贴截图

namespace DllDemoUse
{
class NativeMethod
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
public static extern int LoadLibrary(
[MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

    [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
    public static extern IntPtr GetProcAddress(int hModule,
        [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

    [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
    public static extern bool FreeLibrary(int hModule);

}

}

 static void Main()
    {
        //1. 动态加载C++ Dll
        int hModule = NativeMethod.LoadLibrary("myDll.dll");
        if (hModule == 0) return;

        //2. 读取函数指针
        IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "add");

        //3. 将函数指针封装成委托
        Add addFunction = (Add)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(Add));

        //4. 测试
        int addResult = addFunction(1, 2);

      ···


    }

   delegate int Add(int a, int b);

img

运行结果及报错内容

img

intPtr 里面是个空的指针??

然后我试了32位环境的程序,
我建一个32位的dll,用32位的程序去调用是可以的。
如果我一定要用64位的程序去调用64位的dll的话,请教下如何实现?

  • 写回答

4条回答 默认 最新

  • 於黾 2022-10-24 14:36
    关注

    c#调用c#写的dll,64位exe是可以调用32位dll的,但在调用c++写的32位dll有时会出错,因为int型长度不一致
    感觉你所谓的64位dll其实是个32位的,要不你用32位exe去调用一下试试看

    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 赞助了问题酬金15元 10月27日
  • 赞助了问题酬金1元 10月27日
  • 修改了问题 10月24日
  • 展开全部

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值