C# 调用DLL问题

dailihui123 2010-01-01 03:40:28
那位大侠帮我看看这个DLL调用,在Delphi中调用可以正常,在C#中一直出错,delphi的源代码 和dll的函数都附上。还有我用C#写的程序也一起附上,望高手给小弟看看,在C#中如何调用;

Code
USBDRVD_GetDevCount() //获取设备函数

UINT USBDRVD_GetDevCount(IN GUID * DeviceClassGUID); //函数声明


Example:
UINT DeviceCount = USBDRVD_GetDevCount(&GUID);



//一下为DELPHI 调用 可以正常显示
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
_GUID_ = record
l: DWORD;
s1: WORD;
s2: WORD;
c: array[1..8] of BYTE;
end {_GUID_};
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
btnUSB: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
USB_GUID:_GUID_;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
DevCount:LONGINT;
implementation

{$R *.dfm}
function USBDRVD_GetDevCount(const p: _GUID_): Integer; stdcall;
external 'usbdrvd.dll';

procedure TForm1.Timer1Timer(Sender: TObject);
begin
DevCount:= USBDRVD_GetDevCount(USB_GUID);
btnUSB.Caption:= 'USB '+'( '+ inttoStr(DevCount)+' )';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
USB_GUID.L:=$8B021AA5;
USB_GUID.S1:=$A319;
USB_GUID.S2:=$45C1;
USB_GUID.c[1]:=$93;
USB_GUID.c[2]:=$2C;
USB_GUID.c[3]:=$90;
USB_GUID.c[4]:=$AA;
USB_GUID.c[5]:=$82;
USB_GUID.c[6]:=$E6;
USB_GUID.c[7]:=$47;
USB_GUID.c[8]:=$8D;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

end.



///下边为C#调用 提示 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace _5
{
public partial class Form1 : Form
{
public struct UINI
{
public Int64 L;
public Int64 S1;
public Int64 S2;
public Byte[] c;
}

public int DevCount;
public UINI USB_GUID;

public Form1()
{
InitializeComponent();
}

[DllImport("usbdrvd.dll")]
public static extern Int32 USBDRVD_GetDevCount(UINI USB_GUID);

private void button1_Click_1(object sender, EventArgs e)
{
Application.Exit();
}

private void Form1_Load(object sender, EventArgs e)
{

USB_GUID.c = new Byte[8];
USB_GUID.L=0x8B021AA5;
USB_GUID.S1=0xA319;
USB_GUID.S2=0x45C1;
USB_GUID.c[0]=0x93;
USB_GUID.c[1]=0x2C;
USB_GUID.c[2]=0x90;
USB_GUID.c[3]=0xAA;
USB_GUID.c[4]=0x82;
USB_GUID.c[5]=0xE6;
USB_GUID.c[6]=0x47;
USB_GUID.c[7]=0x8D;

}

private void timer1_Tick(object sender, EventArgs e)
{
try
{

DevCount = USBDRVD_GetDevCount(USB_GUID);
btnUSB.Text = "USB " + DevCount;
}

catch
{
btnUSB.Text = "USB " + "no fund";
}

}

}
}

C# 获取不到设备的信息
[DllImport("usbdrvd.dll")]
public static extern Int32 USBDRVD_GetDevCount(UINI USB_GUID);
这块应该怎么调用usbdrvd.dll呢?
...全文
250 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
soaringbird 2010-01-01
  • 打赏
  • 举报
回复
哦,这里,改成这样:
[DllImport("usbdrvd.dll")]
unsafe public static extern Int32 USBDRVD_GetDevCount(UINI* USB_GUID);
或者在类前面加上unsafe就一了百了了。
dailihui123 2010-01-01
  • 打赏
  • 举报
回复
大侠能否留个QQ 啊 这里不能传文件啊
Jiacker 2010-01-01
  • 打赏
  • 举报
回复

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct UINI
{
public UInt32 L;
public UInt16 S1;
public UInt16 S2;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
public Byte[] c;
}
dailihui123 2010-01-01
  • 打赏
  • 举报
回复
我这样在属性里设置 “将允许不安全代码”打上勾能编译过去了 运行后还是出现同样的问题
dailihui123 2010-01-01
  • 打赏
  • 举报
回复
大侠 我是个新手,在项目属性里怎么设置呢????
soaringbird 2010-01-01
  • 打赏
  • 举报
回复
在项目属性里设置一下即可
蓝色韵脚 2010-01-01
  • 打赏
  • 举报
回复
楼上的有了,我就不回答了!
dailihui123 2010-01-01
  • 打赏
  • 举报
回复
还是不行啊
用一下这两种:
unsafe public struct UINI
{
public UInt32 L;
public UInt16 S1;
public UInt16 S2;
public fixed Byte c[8];
}

或者
public struct UINI
{
public UInt32 L;
public UInt16 S1;
public UInt16 S2;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
public Byte[] c;
}
会提示 “不安全代码只会在使用 /unsafe 编译的情况下出现”

用这种
[DllImport("usbdrvd.dll")]
public static extern Int32 USBDRVD_GetDevCount(UINI* USB_GUID);

会提示: “指针和固定大小缓冲区只能在不安全的上下文中使用”
还是解决不了啊 。
Jiacker 2010-01-01
  • 打赏
  • 举报
回复
2楼的应该可以
soaringbird 2010-01-01
  • 打赏
  • 举报
回复
或者
[DllImport("usbdrvd.dll")]
public static extern Int32 USBDRVD_GetDevCount(IntPtr USB_GUID);
这种比较麻烦
soaringbird 2010-01-01
  • 打赏
  • 举报
回复
[DllImport("usbdrvd.dll")]
public static extern Int32 USBDRVD_GetDevCount(UINI* USB_GUID);
用第一种UINI定义
soaringbird 2010-01-01
  • 打赏
  • 举报
回复
unsafe public struct UINI
{
public UInt32 L;
public UInt16 S1;
public UInt16 S2;
public fixed Byte c[8];
}

或者
public struct UINI
{
public UInt32 L;
public UInt16 S1;
public UInt16 S2;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]
public Byte[] c;
}
abcdef1111111 2010-01-01
  • 打赏
  • 举报
回复
不懂帮顶
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。

111,129

社区成员

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

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

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