请教调用dll的问题

shijies 2020-06-21 09:15:35
Fanyi.dll是要调用的使用Delphi做的dll库, Form2show是Delphi代码中的一个过程,以下的代码报错,不知何故?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("Fanyi.dll", CallingConvention = CallingConvention.StdCall)]

public static extern Form2show;



private void button1_Click(object sender, EventArgs e)
{
Form2show;
}
}
}
...全文
14124 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
蕭笙默 2020-06-28
  • 打赏
  • 举报
回复
学习了,嘿嘿
牧歌ing 2020-06-28
  • 打赏
  • 举报
回复
右键你的项目
选择属性
然后点击生成
目标平台的下拉框选择X86
shijies 2020-06-23
  • 打赏
  • 举报
回复
添加了字符集与入口点还是不行,CharSet = CharSet.Ansi, EntryPoint = "Form2show"

估计是因为D7做的dll,是32位的,而调用程序是VS2017做的,是64位的。不知如何使用VS2017做32位的程序?
zlvol1985 2020-06-23
  • 打赏
  • 举报
回复

using System;
using System.Runtime.InteropServices;
[DllImport("Fanyi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "Form2show")]
 public static extern void Form2show();

private void Test()
{
     Form2show();
}
shijies 2020-06-22
  • 打赏
  • 举报
回复
DLL是用Delphi在XP系统做的,请问是不是与第三条相符:


3.本来C#调用这个DLL是32位的,但是你编译项目时用的是64位的。所以你用64位编译的项目去调用64位DLL,但代码里只设置了调用32位的DLL,这导致调用的路径不对。(抛出异常只会说你找不到指定的模块)
shijies 2020-06-22
  • 打赏
  • 举报
回复
对异常HRESULT:0x8007007E百度了一下,结果为如下:
问题:找不到指定的模块(Exception from HRESULT:0X8007007E)

问题描述:

这个问题想必大家都碰到过,但始终很难找到解决问题的答案。其实这个问题的描述本来就有些模糊,说是缺少模块了,也就是DLL,但又不具体说明白是哪些DLL,实在让人摸不着脑袋。关于C#调用C\C++编写的DLL,我也为此花费了较多的时间去解决。

其实这个问题虽然报错是一样的,但是具体的问题是不一样,通常会有以下情况会报出这样的错误:

1.C#调用DLL时,你调用了DLL里已经被删除的函数,这个函数可能是你之前写上的,但是你后来已经删除了它。

2.C#调用的DLL,然而这个DLL又调用了其他的DLL,其他DLL与这个DLL没有联系上,尤其出现调用多种DLL就容易出现这个问题。

3.本来C#调用这个DLL是32位的,但是你编译项目时用的是64位的。所以你用64位编译的项目去调用64位DLL,但代码里只设置了调用32位的DLL,这导致调用的路径不对。(抛出异常只会说你找不到指定的模块)

4.也可能是编译时必要的系统DLL,因为有些你自己编写出来的DLL,必须依赖某些系统DLL才能链接起来,因此是系统本身缺少了这些模块。

以上常见的情况,说实话第4种出现的情况其实是很少的,除非是你以前安装过或者设置的系统环境不正确而导致的。我也百度过有网友说利用depends.exe这个软件能够找到问题所在。当然,我们可以借助这个软件查看一下是不是真的缺少系统DLL的问题。但有时候你就算查到了好像真的缺少了某些系统DLL,于是你在网上下载下来把它们都放在系统指定的问题,结果还是没能解决这个问题。这时候就不要想缺少系统DLL的问题了,说明问题出现在我以上分析的前三种情况。

还有人说调用DLL失败,其实是没有注册DLL的问题。说句实话,如果是你自己编写的DLL,那就不要尝试着去打开命令提示符进行注册这个DLL了,因为没用,照样失败。

找不到指定的模块,顾名思义就是找不到你编写过的DLL模块,别第一时间就想到的是缺少系统DLL的问题(除非这个DLL并不是你编写的,比如你调用的是某些库的DLL),否则会很浪费时间。
————————————————
版权声明:本文为CSDN博主「你是木头人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chen1083376511/article/details/102884990
shijies 2020-06-22
  • 打赏
  • 举报
回复
导入:
using System.Runtime.InteropServices;


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("Fanyi.dll", CallingConvention = CallingConvention.StdCall)]

public static extern void Form2show();



private void button1_Click(object sender, EventArgs e)
{
Form2show();
}
}
}

程序可以编译通过,但是运行出现异常:
System.DllNotFoundException: 无法加载 DLL“Fanyi.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。
github_36000833 2020-06-21
  • 打赏
  • 举报
回复
先阅读参考: 【平台调用 (P/Invoke)】 https://docs.microsoft.com/zh-cn/dotnet/standard/native-interop/pinvoke 其中第二句应可以解决你命名空间名问题。 然后你要知道如何在Delphi下导出函数。 然后你用相同的调用规则来调用Delphi导出函数。
shijies 2020-06-21
  • 打赏
  • 举报
回复
我自己看了一遍,Delphi代码中的一个过程到了C#中是一个方法,将Form2show改成了Form2show(),但是编译通不过,可能缺少 using,不知该如何using。

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS0246 未能找到类型或命名空间名“DllImport”(是否缺少 using 指令或程序集引用?) WindowsFormsApp1 F:\练习1\WindowsFormsApp1\WindowsFormsApp1\Form1.cs 19 活动的
bryantwjc 2020-06-21
  • 打赏
  • 举报
回复
是不是需要导入什么?Delphi下导出的函数直接用,C#是不是类名.方法名的形式?
shijies 2020-06-21
  • 打赏
  • 举报
回复
是不是需要导入什么?Delphi下导出的函数直接用,C#是不是类名.方法名的形式?

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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