asp.net写webapp是否能调用引用了其它非托管dll的c++非托管dll?

错误提示为:内存位置访问无效
我编写了一个独立的c++dll非托管是可以被调用的,但我在里面引用了ffmpeg之后,在普通c#程序中能够正常工作,在asp里却不能,问题出在哪里?
如果可以的话,那些被调用的dll应该放在哪里?

1个回答

看上去应该是权限或者调用文件路径的问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Asp.net调用非托管的DLL
1.开发环境:VS2010rn2.我写了一个类来加载DLL代码如下Libraryrn3.我用其他语言写了一个DLL:test.dllrn4.将test.dll放到网站的Bin目录下rn5.调用的代码如下:rn public string Test1()rn rn string libFileName = Server.MapPath("Bin/test.dll"); rn Library lib = new Library();rn lib.LibFileName = libFileName; rn if (lib.Load())rn return libFileName + "--OK";rn elsern return libFileName + "--NO";rn rn6.现在的问题是,调试状态下能够正常加载DLL并使用,可是一发布网站就加载不成功了rnrnrnrnpublic class Libraryrn rn [DllImport("kernel32.dll")]rn private extern static IntPtr LoadLibrary(string path);rn [DllImport("kernel32.dll")]rn private extern static IntPtr GetProcAddress(IntPtr lib, string procName);rn [DllImport("kernel32.dll")]rn private extern static bool FreeLibrary(IntPtr lib);rnrn private IntPtr hLib;rn private string libFileName;rnrn public Library()rn rn rnrn public Library(string libFileName)rn rn this.libFileName = libFileName;rn Load();rn rnrn ~Library()rn rn if (hLib != IntPtr.Zero)rn FreeLibrary(hLib);rn rnrn public bool Load()rn rn hLib = LoadLibrary(libFileName);rn return hLib != IntPtr.Zero;rn rnrn  public Delegate Resolve(string procName, Type t)rn  rn   IntPtr api = GetProcAddress(hLib, procName);rn   return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);rn    rnrn public string LibFileNamern rn get rn rn return libFileName;rn rn setrn rn libFileName = value;rn rn rn rn
asp.net调用非托管DLL
[img=https://img-bbs.csdn.net/upload/201405/30/1401431521_648083.jpg][/img]rn [DllImport("crypt32.dll",rn SetLastError = true,rn CharSet = System.Runtime.InteropServices.CharSet.Auto)]rn private static externrn bool CryptProtectData(ref DATA_BLOB pPlainText,rn string szDescription,rn ref DATA_BLOB pEntropy,rn IntPtr pReserved,rn ref CRYPTPROTECT_PROMPTSTRUCT pPrompt,rn int dwFlags,rn ref DATA_BLOB pCipherText);rn大家看我这一段代码,我是要调用系统的crypt32.dll桌面远程连接rdp文件进行密码加密,在本地执行没有问题,加密之后直接远程连接了不需要密码,可是当我把项目发布到IIS上时,我在另一台电脑去访问执行时间远程连接提示还是需要输入密码明显密码加密不正确!!!这里我想问下有什么方法可以发布到IIs客户端去浏览时调用客户电脑crypt32.dll呀,因为每个不同系统的crypt32.dll加密都不一样的[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/54.gif][/img]大家有什么好的方法吗???求高手帮助呀,感恩不尽...
ASP.NET 调用非托管DLL
我在ASP.NET中引用里添加了一个DLLrnrn在VS2008环境下调试是,DLL返回的结果是对的,rn但是,放到IIS下时,DLL返回的结果就不对了。rnrn如果此时在Web.config 中添加了rnrn时,IIS下DLL返回结果就是对的。rnrn但是这样权限就放得太大了。rn请问下大家有什么好的解决方法
asp.net调用非托管.dll疑问
大家好,小弟最近在为一个USB电话录音盒设备写客户程序,算是二次开发。开发平台是VS2008中.net Framework 2.0,做的是ASP.NET应用程序。厂房提供了设备相关的dll,都是标准的Win32 API(非托管)。rn 当中有这么一个方法:rnrn 函数名称:DWORD WINAPI LoadDRV(void);rn 入口参数:无rn 函数返回:1成功 rn 小于0表示调用失败。rn 功能描述:加载系统驱动程序,即检测USB录音盒有没有连接到电脑。rnrnrn 现在的问题是,我在Default.aspx.cs 中用 DllImport(“完整的物理路径”)引入,在本地上调试运行一切正常,但部署到IIS后,用别人的机访问即便设备已连接上电脑但LoadDRV还是返回失败,但在我本地就算是访问自己本机的IIS也不会出现这样的问题,所有用于测试的机器都处于公司的内网,同一个网段上。rnrn 我已经把要调用的.dll文件放得满磁盘都是,什么BIN,SYSTEM32,系统目录都放了....rnrn 后来在网上发现,还有另一种调用.dll的方法,即利用LoadLibrary(),GetProcAddress获取函数的指针,我根据网上的例子尝试,服务器上编译运行没问题,可一放到IIS上,用别的客户机访问,同样的问题仍旧存在,唉~rn rn 下面把我关于这个问题写的代码贴出来,请大侠们帮帮我,真的是十万火急~rn rn 首先是DllInvoke类,用于动态调用dll方法。rnrn public class DllInvokernrn [DllImport("kernel32.dll")]rn public extern static IntPtr LoadLibrary(string path);rn [DllImport("kernel32.dll", SetLastError = true,CharSet = CharSet.Ansi)]rn public extern static IntPtr GetProcAddress(IntPtr lib, string funcName);rn [DllImport("kernel32.dll", EntryPoint = "FreeLibrary", SetLastError = true)]rn public extern static bool FreeLibrary(IntPtr lib);rnrn public static Delegate Invoke(string DLLPath, string APIName, Type t)rn rn IntPtr hLib = LoadLibrary(DLLPath);rn if (hLib == IntPtr.Zero)rn rn throw (new Exception("未载入有效的DLL模块, 请确认DLL文件: " + DLLPath + "是否有效!"));rn rn IntPtr hApi = IntPtr.Zero;rn hApi = GetProcAddress(hLib,APIName);rn if (hApi == IntPtr.Zero)rn rn throw (new Exception("无效的函数名: " + APIName));rn rn return Marshal.GetDelegateForFunctionPointer(hApi, t);rn rnrnrn 接着是调用,Default.aspx.csrn rn public delegate int FuncLoadDRV();rn public int LoadDRV()rn rn FuncLoadDRV fun = (FuncLoadDRV)DllInvoke.Invoke(Server.MapPath(@"~/Bin/usbms.dll"), "LoadDRV", typeof(FuncLoadDRV));rn int result = fun();rn return result;rn rn rn protected void Page_Load(object sender, EventArgs e)rn rn if (!Page.IsPostBack)rn rn if (LoadDRV() > 0)rn rn this.ListBox1.Items.Add("加载USB驱动设备成功!");rn this.btnStartRecord.Enabled = true;rn rn elsern rn this.ListBox1.Items.Add("加载USB驱动设备失败!");rn Response.Write(" ");rnrn rn rnrn 多说一句,前台我用了UpdatePanel,也不知道有没有关系。rnrn 再将问题重申一次,就是在本地调试或访问本机上的IIS时,一切正常。但用别人的机器访问时,LoadDRV总返回失败信息,即便设备已正常接入。这个问题已经折磨我好多天了,厂商提供的客户端是C/S模式的,难道就不能改成B/S模式吗,难道是.dll本身不支持吗,请各位前辈指点一下,小弟在此感激不尽~rn rn
c#调用非托管dll
c#调用非托管dll c#调用非托管dll c#调用非托管dll c#调用非托管dll
c# 调用 非托管 dll
本人在.net程序中使用jmail发送邮件,但是空间不提供jmail 注册支持。我想直接在内存动态加载使用,谁做过这方面的东西,指点一下
调用非托管dll的问题
我用vc做的mfc dll,函数都是包含在类里的,这种情况下怎么找vDllImport的入口啊??怎么使用?我对dll的分类不大了解,但是现在要用非托管的dll,不知道怎么用啊??还有,在vc。net里怎么调用dll啊??添加了引用还说什么不认识某某类。。。。
非托管dll调用
dll rn bp2316.dllrnrnrn函数rn int _VI_FUNC bp2316_init (int COMPort, int baudRate, double timeoutseconds,rn int blockCheck, int groupAddress, int userAddress,rn int resetDevice, int *instrumentID);rn int _VI_FUNC bp2316_meas_start (int instrumentID);rn int _VI_FUNC bp2316_meas_read (int instrumentID, double *measuringValue,rn char unit[]);rn int _VI_FUNC bp2316_meas_stop (int instrumentID);rn int _VI_FUNC bp2316_send_scpi (int instrumentID, char sendSCPIMessage[]);rn int _VI_FUNC bp2316_receive_scpi (int instrumentID, char sendSCPIMessage[],rn char instrumentAnswers[]);rn int _VI_FUNC bp2316_close (int instrumentID);rnrn请问高手们C#中如何代码调用?rnrn自己写了一个,但是调用的时候报错“找不到指定模块”。rn [DllImport("bp2316.dll")]rn public extern static short bp2316_init(short COMPort, short baudRate, double timeoutseconds, short blockCheck, short groupAddress, short userAddress, short resetDevice, ref short instrumentID);
C#调用非托管DLL
新建C++win32项目工程,选择生成dll类型        供外部调用的程序类似这种结构      #include "stdafx.h" namespace myC{ extern "C" __declspec(dllexport) int meth(int a, int b) { return a + b; } }        红线部分大概意思是 供外部使用标记,用C编译
非托管dll的调用问题
[code=C/C++]rnstruct IMsgCallbackrnrn virtual int MsgNotify(WPARAM wParam, LPARAM lParam) = 0;rn;rn[/code]rn如何用C#语言解释rn[code=C#]rn public struct IMsgCallbackrn rn public delegate int MsgNotify(UIntPtr wParam, IntPtr lParam);rn rn[/code]rnrn请问上面的C++代码可不可以改用委托来实现呢
C# 调用非托管Dll
做一个Asp.Net项目要用到一个 非托管的Dll和下位硬件通讯rn新建一个类对dll中的方法稍微封装了下rn类内容大致如下rn[code=C#]rnpublic class XXXrn rn [DllImport(@"F:\Code\WebSite2\xxx.dll", EntryPoint = "Fun", CharSet = CharSet.Unicode)]rn public static extern int Fun(...);rnrn[/code]rnrn然后调用的时候就rn[code=C#]rn XXX.FUN(...);rn[/code]rnrn类里面有个 连接 和 关闭连接 的方法,在调试过程中,当连接成功后,再连接的话就出现了“设备未连接的”的错误代码,调用 关闭连接 方法,似乎不起效果,当退出虚拟服务器后,再次连接成功了,但接着又出现了上面的错误代码……rn这是什么原因,是不是调用的dll还要进行释放?
ASP.NET加载非托管DLL的问题
WEBForm加载一个由VC++开发的非托管的DLL(A),调用的函数接口都是在DLL(A),同时这个DLL(A)调用了另一个DLL(B)的函数,两个DLL放在同一个目录下,由DLL(A)动态调用。rn现在,情况是这样的,刚开始同时把两个DLL放在Bin目录下,两个都加载不了,后来上网搜索了一下,把两个都放在System32目录下,DLL(A)加载就没问题了,函数也可以执行,但是找不到DLL(B),这是怎么回事?rn我用WINForm测试了一下,把两个DLL放在Bin\Debug里,一切OK,WebForm是不是要设置什么?rn
.net4.0调用非托管DLL的异常捕获
由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出。 托管程序使用通常的捕获try……catch块不起作用。原因是.NET 4.0里新的异常处理机制引起。 在4.0以前,因为SEH异常被转换成了跟普通.NET异常相同的异常,这样程序员只要用catch ( Exception e)的模式就可以捕捉到所有的异常。这样处理的问题是,由于SEH异常通常都不
C#如何调用非托管DLL?
用DllImport导入的话,DLL文件如何指定路径或放在哪?如:rn//初始化gsm modem,并连接gsm modemrn [DllImport("dllforvc.dll",rn EntryPoint = "GSMModemInitNew",rn CharSet = CharSet.Ansi,rn CallingConvention = CallingConvention.StdCall)]rn public static extern bool GSMModemInitNew(rn string device,rn string baudrate,rn string initstring,rn string charset,rn bool swHandshake,rn string sn);rnrn我知道这个DLL和函数,但不知道如何指定DLL路径与他对应。我把DLL放在项目文件夹确提示,找不到DLL。。求解!
C#调用非托管DLL问题
各位高手,小弟最近需要在C#中调用非托管dll中的一些函数和类,调用函数的方法找到了,可是如何使用dll中的类啊? dll是非com的 谢谢各位高手了
调用非托管DLL参数问题
c# 调用非托管DLL参数问题调用非托管DLL参数调用非托管DLL参数问题
C#中调用非托管.dll
这是一个.dll中的函数rnlong WINAPI AutoOpenComPort(long Port, unsigned char *ComAdr, unsigned char * Baud,long *FrmHandle)rnrn那我在c#中怎么封装这个函数,怎么调用??rn请大侠们帮忙
C# 调用非托管DLL文件。
C# 调用非托管DLL文件。DLL文件是用C语言编写的。rn如下:rn1:结构定义rn rditag_t rn rditag_t结构定义了测点的结构rn typedef struct _rditag_trn rn char tagname[RDI_MAX_TAGNAME_LEN]; /*[in]*/rn float val; /*[out]*/rn int status; /*[out]*/rn rditag_t;rn 2:rditagname_trn rditagname_t定义了测点名类型rn typedef char rditagname_t[RDI_MAX_TAGNAME_LEN];rn----------------------------------------------------rn函数说明:rn 1:void rdi_read(rditag_t tags[], int count, int timeout);rn 参数rn tags 读取数据点数组。rn count 输入参数。rn timeout 输入参数。rn 2: void rdi_read0(rditagname_t tagnames[], float values[], int statuses[], int count, int timeout);rn参数rntagnames 输入参数。rnvalues 输出参数。rnstatuses 输出参数。rncount 输入参数。rntimeout 超时值(毫秒)。rn返回值rn 无。rn---------------------------------------------------------------------------------------rn用C#调用rn public struct rditag_structrn rn public string tagnaem;rn public float val;rn public int status;rn rnrnrnrn rditag_struct[] target_data_array = new rditag_struct[2000];//结构数组 0 - 1999rn rditag_struct target_date_struct = new rditag_struct();//结构变量rn target_date_struct.tagnaem[1] = "1ELE-11";rn target_data_array[1] = target_date_struct;rn rdi_read(ref target_data_array, 1, 2000);rn测试结果:rn 无返回值。target_data_array 的上限为0
C# 调用C++写的非托管DLL
1. 接口函数所在动态库:LzCoUserClt4.dll。rn2. 接口方法:extern "C" int __declspec(dllexport) _GetUserID(char* szUserID)rn3. 调用举例:rn[code=c]CString strFileNamePath = _T(“LzCoUserClt4.dll”);rnHMODULE hLib = LoadLibrary(strFileNamePath);rntypedef int (*fun)(char*);rnfun p = (fun)GetProcAddress(hLib,"_GetUserID");rn if (p != NULL) rn rnchar szUserID[512];rnmemset(szUserID, 0, 512);rn p(szUserID);rn [/code]rnrn只可惜我对C++一点也不懂,求大神给出在C#中调用这个dll中_GetUserID函数的代码rn
非托管C++调用C#的dll
C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。
webserveices中调用非托管的Dll
webserveices中调用非托管的Dll,dll要访问一个txt文件,一直打不开文件(fopen("beijing.dat","r+")),用WinForm测试是没有问题的,那位大侠指点一下 rn
asp.net调用非托管DLL IIS权限设置
调用方法rn[DllImport("MXOTDLL.dll", EntryPoint = "MXIsFingerOn")]rnpublic static extern int MXIsFingerOn();rnrnMXOTDLL.dll已经拷贝到C:\WINDOWS\system32 下rnrn现在问题是如果直接在vs2005下运行网站,是可以成功调用此方法成功返回 1。如果把网站放到IIS下就返回0,说明调用DLL失败了,在网上了解一下说是IIS权限问题,说在组件服务DCOM配置,不过没找到这个DLL,rnregsvr32 MXOTDLL.dll 也不行 提示没找到输入点rn不知道怎么办了
调用非托管的DLL出现的问题
mwrf32.dll中有如下函数,说明如下:rn1. HANDLE rf_init(__int16 port,long baud);rn2. __int16 rf_exit(HANDLE icdev);rn3. __int16 rf_card(HANDLE icdev,unsigned char _Mode,unsigned long *_Snr);rn功 能:寻卡,能返回在工作区域内某张卡的序列号rn参 数:HANDLE icdev:rf_init()返回的设备描述符rn unsigned char _Mode:寻卡模式rn Mode=0: IDLE模式,一次操作一张卡rn Mode=1: ALL模式,一次操作多张卡 rn unsigned long *_Snr: 返回卡的序列号地址rn返 回:成功则返回 0rn 例:__int16 st;rn unsigned long snr;rn st=rf_card(icdev,IDLE,&snr);rn------------------------------------rn把1和2写成这样没问题:rn//初始化端口rn [DllImport("mwrf32.dll")]rn public static extern IntPtr rf_init(int port,Int32 baud);rn//关闭端口rn [DllImport("mwrf32.dll")]rn public static extern int rf_exit(IntPtr icdev);rn可是3怎么写都不行,谁能告诉我,3应该怎么写。
如何引用非托管dll
现有Delphi写的dll,在VS上添加引用,报错提示请确保此文件可访问并且是一个有效的程序集或COM组件。rn在网上搜索,说是要先注册,使用regsvr32注册,提示模块“”加载失败,请确保该二进制存储在指定的路径中,或者调试它以检查。。。rn现在不知道怎么写了!大侠们咋整?rn顺便附上代码:rn[DllImport("reader.dll", EntryPoint = "readcard",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]rn public static extern void readcard(StringBuilder kh, StringBuilder balance)rnrn
如何延迟加载非托管DLL
如题,或者说满足一定条件才加载DLL,应该怎么处理
非托管dll加载的问题
问题是这样的 我用C#开发 asp.net 用到c++写的dll api 我是这样写的rnusing System.Runtime.InteropServices;rn[DllImport("WSMCPAI.dll",CharSet=CharSet.Auto)]rnpublic static extern int InitSMCAPI(string INIFile);rn[DllImport("WSMCPAI.dll",CharSet=CharSet.Auto)]rnpublic static extern int SendData(string CMID,string MsgContent);rn在下面的函数里rnnInitSMCAPI = InitSMCAPI(filepath);rn调式时错误 DLL不能加载rn我把WSMCPAI.dll添加到BIN目录下的啊 rn
C#使用非托管dll
最近遇到C#使用非CLR动态链接库的问题。有很多东西不太明白,特来请教高手帮忙。rn 1、C#代码在CLR环境中都是自动分配和释放内存的。 如果C/C++编写的dll中有动态分配内存的情况,CLR去调用的时候会怎么处理呢?c/c++ dll动态分配的内存会在真正的堆上吗?如果是,那dll的环境和CLR的环境岂不就是独立的。怎么可能呢?如果dll动态分配的内存被CLR管理,那么如果dll中动态分配了一个结构体对象,并返回这个结构体对象的引用,我们在外部如何使用这个引用并访问结构体的成员。rn 2,如果dll需要传递一个结构体对象的引用,我们如何在C#代码中为c/c++的dll准备这个参数呢?rnrn高手可以用代码举个例子吗?不胜感激。rnrn
托管代码动态调用非托管DLL
使用托管代码动态调用非托管的DLLrn[code=C#]rnusing System;rnusing System.Collections.Generic;rnusing System.Text;rnusing System.Runtime.InteropServices;rnnamespace InteropDemornrn public static class NativeMethodrn rn [DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]rn public static extern int LoadLibrary(rn [MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);rn [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]rn public static extern IntPtr GetProcAddress(int hModule,rn [MarshalAs(UnmanagedType.LPStr)] string lpProcName);rn [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]rn public static extern bool FreeLibrary(int hModule);rn rnrnrnusing System;rnusing System.Collections.Generic;rnusing System.Text;rnusing System.Runtime.InteropServices;rnnamespace InteropDemornrn class Programrn rn static void Main(string[] args)rn rn //1. 动态加载C++ Dllrn int hModule = NativeMethod.LoadLibrary(@"c:\CppDemo.dll");rn if (hModule == 0) return;rn //2. 读取函数指针rn IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "Add");rn //3. 将函数指针封装成委托rn Add addFunction = (Add)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(Add));rn //4. 测试rn Console.WriteLine(addFunction(1, 2));rn Console.Read();rn rn /// rn /// 函数指针rn /// rn /// rn /// rn /// rn delegate int Add(int a, int b);rn rnrn[/code]rn在使用上述这个方法时需要注意什么?rn再有还有没有其他的动态调用的方法?
C# 无法加载非托管dll
代码如下:rn[DllImport(@"C:\Program Files\testsetup\ShareCommunication.dll", CallingConvention = CallingConvention.StdCall)]rnpublic static extern IntPtr InitEnv();rnrn在程序初始化加载时调用:rnInitializeComponent();rnstring sRet = Marshal.PtrToStringAnsi(InitEnv());rnrn已把此dll放在目录"C:\Program Files\testsetup\ShareCommunication.dll"下,在本地调试代码时不会报错的,但是打包(把所有文件加入到打包内)后在别人电脑上就报错了,之前放在程序bin目录下,代码调试也没问题,但是打包到别人电脑上就是不行rnrncatch异常为无法加载DLL"C:\Program Files\testsetup\ShareCommunication.dll"找不到指定的模块rnrnrn在环境变量path也配路径了,还是不行,大家遇过这种情况吗?rn
引用非托管找不到dll
引用非托管代码找不到dll,网上找到解决方法是建立委托,看不太懂,有没有再详细点的.
请教C++ 非托管DLL 调用的问题
高手好:rn 我现在手头有第三方的C++ 类库,一共有两个文件夹,一个里面为openldap.dll文件和openldap.lib ,一个文件夹里面为.h头文件,请问我用C#可不可以调用这个openldap.dll,我怎样才能查到里面的函数?rn 谢谢,100分相送!!
C#中调用非托管C++ dll
C#中调用非托管C++dll中的函数时,形参类型需要转换成.NET支持的类型,如果rnc++中有rnvoid fun(vector &vs);rnrn在c#中形参应该变为什么?
.Net调用非托管dll问题,真离奇!!!!!!!!
.Net调用C++写的非托管dll,在xp下运行正常,但是程序移植到server 2003下时始终不能加载该dll,请教下高手有什么方法没。server 2003下kernel32.dll在system32下存在的,而且路径没问题。
调用非托管DLL不成功,请帮帮忙
public class TestDllrn rn [DllImport("keyint.dll")]rn public static extern void init(ref string ErrCode);rnrn public static string testinit()rn rn string errcode = "0";rn init(ref errcode); //这句出错,提示:未将对象的引用设置到对象的实例??rn return errcode;rn rn
非托管C++程序中调用C#的dll
    刚去的新公司分配了我一个项目需求,将PPT文件(包括*.ppt和*.pptx)转换成多张png图片。由于以前只有native C++的经验,在网上逛了多圈后,发现都是使用C#实现这个功能的,被这个需求折磨了几天后,今天终于把这个问题解决了。所以在此记录下解决这个项目需求的总结。     C#的程序代码在非托管的C++环境中使用有三种方式:1.平台调用技术(P/Invoke)。2. C++...
托管C++中调用 非托管C++的DLL
查了一些资料,能查到的都是C#的,但是还没有很理解,而且在自己的CLR工程里也不通,我是想调用非托管的DLL,C#里说是要用System::Runtime::InteropServices;在使用DLL里的函数之前,要声明rn[DllImport("function.dll")] rnpublic static extern int MF_Getsnr(int mode, int halt, [In]byte[] snr, [In]byte[] value);rnrn要设置DLL路径、名字,要与DLL中函数名称、返回值、参数列表的类型完全一样,进行一些转换,但是还是不行。rnrn应该怎么调用非托管的DLL?
非托管dll引用,函数结构体调用报错
int read (int nDevHandle, const OpParam *pReaderParam, DealReport *func)rntypedef structrn rn unionrn ReadParam tReadParam;rn WriteParam tWriteParam;rn op;rn unsigned int a;rn unsigned short b;rn unsigned short c;rnOpParamElement;rn以上代码如何转化成c#的结构体???急急
C#调用非托管DLL文件指针类型转化问题
DLL文件是C++的。rnrn原来在c++下面的定义分别是rnLONG NET_DVR_RealPlay_V30(rn LONG lUserID,rn LPNET_DVR_CLIENTINFO lpClientInfo,rn fRealDataCallBack_V30 cbRealDataCallBack,rn void *pUser,rn BOOL bBlockedrn);rntypedef void(CALLBACK *fRealDataCallBack_V30)(rn LONG lRealHandle,//当前的预览句柄 rn DWORD dwDataType,//数据类型 rn BYTE *pBuffer,//存放数据的缓冲区指针 rn DWORD dwBufSize,//缓冲区大小 rn void *pUserrn);rnrnBOOL PlayM4_OpenStream(LONG nPort,PBYTE pFileHeadBuf,DWORD nSize,DWORD nBufPoolSize);rn 说明:打开流接口(类似打开文件);rn 输入参数:pFileHeadBuf用户从回调中得到的文件头数据。nSize 文件头长度。rn nBufPoolSize 设置播放器中存放数据流的缓冲区大小。rnBOOL PlayM4_InputData(LONG nPort,PBYTE pBuf,DWORD nSize);rn 说明:输入从卡上得到的流数据;打开流之后才能输入数据。rn 输入参数:pBuf 缓冲区地址;rn nSize缓冲区大小rn 返回值:TURE,表示已经输入数据。FALSE 表示失败,数据没有输入;rnrn我在c#里面写成如下:rn[DllImport("HCNetSDK.dll")]rnpublic static extern Int32 NET_DVR_RealPlay_V30(Int32 lUserID, ref NET_DVR_CLIENTINFO lpClientInfo, fRealDataCallBack_V30 cbRealDataCallBack, IntPtr pUser, bool bBlocked);rnrn public delegate void fRealDataCallBack_V30(Int32 lRealHandle, UInt32 dwDataType, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, UInt32 dwBufSize, System.IntPtr pUser);rnrn [DllImport("PlayCtrl.dll", EntryPoint = "PlayM4_OpenStream", CharSet = CharSet.Ansi)]rn public static extern bool PlayM4_OpenStream(Int32 nPort, byte[] pFileHeadBuf, UInt32 nSize, UInt32 nBufPoolSize);rn [DllImport("PlayCtrl.dll", EntryPoint = "PlayM4_SetStreamOpenMode", CharSet = CharSet.Ansi)]rn public static extern bool PlayM4_InputData(Int32 nPort, byte[] pBuf, System.UInt32 nBufSize);rn rnrn现在的问题是fRealDataCallBack_V30里面的BYTE *pBuffer,是存放数据的缓冲区指针rnPlayM4_OpenStream里面的PBYTE pFileHeadBuf是存放数据的缓冲区指针 rnPlayM4_InputData里面的PBYTE pBuf是缓冲区地址,rn,而c#里面又没有指针,现用byte[] pBuffer,byte[] pFileHeadBuf,byte[] pBuf代替,但是这样一来,字节数组的长度是固定的只有1位,无法接收更长的数据,而实际缓冲区每次长度都不一样,无法固定,如果使用[MarshalAs(UnmanagedType.LPArray,SizeConst=999999)] byte[],指定大小,这样会提示未处理 System.AccessViolationExceptionrnMessage: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。rnrn我该如何定义?请高手指教rn
C#调用非托管dll动态库返回值问题
函数原型:unsigned char* FindToken() 返回值是一个定长8字节的值rnrn我用C#如些调用:rn[DllImport("GDHidUserCtrl.dll", EntryPoint = "FindToken")]rn [return: MarshalAs(UnmanagedType.LPArray, SizeConst = 8)]rn internal static extern byte[] FindToken(); rn public static byte[] getUsbKey()rn rn return FindToken(); rn rnrn但运行时出现如下错误:rn无法封送处理“return value”: 无效的托管/非托管类型组合。 rn说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 rnrn异常详细信息: System.Runtime.InteropServices.MarshalDirectiveException: 无法封送处理“return value”: 无效的托管/非托管类型组合。rnrn源错误: rnrnrn行 26: public static byte[] getUsbKey()rn行 27: rn行 28: return FindToken(); rn行 29: rn行 30: rn rnrn源文件: e:\UsbKey\App_Code\UsbKeyClient.cs 行: 28 rnrn堆栈跟踪: rnrnrn[MarshalDirectiveException: 无法封送处理“return value”: 无效的托管/非托管类型组合。]rn UsbKeyClient.FindToken() +0rn UsbKeyClient.getUsbKey() in e:\UsbKey\App_Code\UsbKeyClient.cs:28rn testusbkey.Button1_Click(Object sender, EventArgs e) in e:\UsbKey\testusbkey.aspx.cs:20rn System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75rn System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +98rn System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7rn System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11rn System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33rn System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4919rnrn 跪求各位高手帮小弟解决此问题,好急人啊!!!
c#调用非托管DLL出错的问题
原形rnint CFCA_VerifySignedDataDetached(char *signature, long signatureLength, char* originalData, int *originalDataLength, char *certificate, long *certificateLength, HCFCAToolkit toolkitHandle);rnrnsignature 输入rnsignatureLength 输入rnoriginalData 输入rnoriginalDataLength 输入rncertificate 输出rncertificateLength 输出rntoolkitHandle 输入rnrn转换成rn[DllImport("CFCAToolkit.dll", EntryPoint = "CFCA_VerifySignedDataDetached", SetLastError = true,rn CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]rn public static extern int CFCA_VerifySignedDataDetached(string signature, long signatureLength, string originalData, ref int originalDataLength, char[] certificate, ref long certificateLength, IntPtr toolkitHandle);rnrn调用报AccessViolationException异常,似乎是certificate这个参数传递造成的,请高手指点!
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法