Windows Mono C#调用C++ DLL DllNotFoundException 问题 5C

我在windows7 环境下安装了最新版本的mono,运行了一些helloworld程序正常运行。
问题:我有一个C#项目,C#调用了C++的一个动态库,如果我用VS2008运行C#或者直接运行编译出的exe程序,都能正常调用C++dll, 但是我如果用mono 运行 exe程序就会报动态库找不到,System.DllNotFoundException。dll库就是求和功能,贴上 C++dll源码:sum.h

 #pragma once 
extern "C" _declspec(dllexport) int _stdcall sum(int a ,int b);

sum.cpp

 #include "Sum.h"
int _stdcall sum(int a,int b)
{
    return a + b;
}

C#工程源码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace TestCppDLL
{
    class Program
    {
        [DllImport("GetSum", EntryPoint = "sum", CallingConvention = CallingConvention.StdCall)]
        public extern static int sum(int a, int b);
        static void Main(string[] args)
        {
             int num = sum(1,2);
            System.Console.WriteLine(num);
            System.Console.ReadLine();
        }
    }
}

自己搜索了一下:说是要在mono 的config中指定 dll 于是配置Mono安装目录下/etc/mono
/config文件:

 <dllmap dll="GetSum.dll" target="C:/path/GetSum.dll"/>

运行还是同样的错误。我又单独配置了GetSum.dll.config 内容:

 <configuration>
    <dllmap dll="GetSum.dll" target="C:/path/GetSum.dll" />
</configuration>

依然是同样的错误!!!!!

哪位大神给解答下啊。。。。。

2个回答

mono没有用过,比较怀疑你的程序是不是编译成64bit的了,所以无法找到32bit的dll

还有,难道你在linux下运行?那没法用dll,linux下的动态库是so,要用gcc的编译器、链接器。你google下

chuanyueniwo
chuanyueniwo 程序编译成x86 32位了,我注意这一点了。 我是在windows下运行的。C++库是用vs2008编译的
10 个月之前 回复

解决了,下载了个32位mono 可以正常运行了.......... 64位的mono 不可以。。。。 大坑啊。害我搞了好长时间

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#调用c写的dll时DllNotfoundexception的错误
namespace DllTestrnrn public class TestCallC_dllrn rn [DllImport("LTM8901DC.dll", CharSet = CharSet.Ansi)]rn public static extern int LTM8901DC(string portNum, int bandrate, int address, double temp, double humidity);rn rn public partial class Form1 : Formrn rn public int mResult;rn public Form1()rn rn InitializeComponent();rn rnrn private void Form1_Load(object sender, EventArgs e)rn rnrn rn rn private void button1_Click(object sender, EventArgs e)rn rn double tem = 0, hum = 0;rn mResult = TestCallC_dll.LTM8901DC("COM6", 9600, 0, tem, hum);rn switch(mResult)rn case 1:rn Console.WriteLine("通讯成功," + "tem:" + tem + "hum:" + hum);rn break;rn case -1:rn Console.WriteLine("串口初始化未成功");rn break;rn case -2:rn Console.WriteLine("命令发送失败");rn break;rn case -3:rn Console.WriteLine("数据接收失败");rn break;rn case -4:rn Console.WriteLine("数据格式错误");rn break;rn rn rn rnrnrn结果在mResult = TestCallC_dll.LTM8901DC("COM6", 9600, 0, tem, hum);rn处提示:rn未处理DllNotFoundExceptionrn无法加载DLL “LTM8901DC.dll”:找不到指定的模块。(异常来自rnHRESULT:0X8007007E)rn哪位大侠遇到过啊?????rn帮忙看一下
Win7下VB.net调用DLL报告DllNotFoundException
大家好,我最近遇到一个问题,在Win7下用VS2008写的程序调用了一个DLL,运行的时候报告“System.DllNotFoundException:无法加载DLL “HSFileED.dll”:内存位置访问无效。(异常来自HRESULT:0x800703E6)。”同样的程序在安装了.net framework 3.5 sp1的XP环境下可以正常工作。请问这个问题应当如何解决?
DLLNotFoundException
无法加载DLL“DLLff2010.dll”:找不到指定模块(异常来自HRESULT:0x8007007E).rnrn我得程序之前一直可以调用这个DLL (vc做的)rn rn [DllImport("DLLff2010.dll", EntryPoint = "?InitInstance@@YAHXZ",rn CharSet = CharSet.Auto)]rn public static extern bool InitInstance();rnrn但是今天就提示这个错误 我从别的机器拷贝到另一个机器 有影响吗rnrn
C#调用c的dll问题
函数原型:int WINAPI rf_anticoll(unsigned short icdev, rn unsigned char bcnt,rn unsigned char *pSnr,rn unsigned char *pLen)rn参数:icdev:[IN] 通讯设备标识符rn bcnt: [IN] 取值4rn pSnr: [OUT]返回的卡序列号rn pLen: [OUT]返回序列号的长度rn返回:成功返回0rn我在c#中应如何定义入口参数?rnpublic static extern int rf_anticoll(int dev, byte bcnt, out string pSnr, out int len)rn这个不行。报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
C#调用C Dll的问题
在C#中调用C写的Dll,rn函数原型为 void GetPic(char * szCode, BYTE * pPicture)rnrn用C#建个窗口应用程序rnrn [DllImport("PictureGenerator.dll", EntryPoint = "GetPic")]rn static extern void GetPic(string szCode, byte[] pPicture);rnrnrn private void Form1_Load(object sender, EventArgs e)rn rn rn Byte[] pPic = new Byte[9000];rn GetPic("test", pPic);rn rnrn这样是可以调用的。rnrn但是,同样的代码,放在WEB中就不行了。在运行到GetPic时就会出错。说是 rnNullReferenceException: 未将对象引用设置到对象的实例rn这是为什么啊,窗口程序的与WEB有什么不同么。
c#调用C的DLL
c#调用C的DLL
c#调用c的dll
小弟目前遇到一个问题,本人的程序是c#开发的,需要调用别人使用c开发的dll,而这dll里面存在一些汇编代码,在我的程序调用到存在汇编操作的dll函数时,程序报错,“内存不能读取或写入,可能是内存以损坏”。rn请各位高手指点一下,如何解决。
c# 调用 c dll
我在c#中调用 c 写的dll动态链接库,弄了好久,总是报“尝试读入或写入受保护的内存”这样的错误,估计是参数类型对应出错了。大家帮忙看下,下面这个动态库中的c语言函数转换成c#的函数,参数该是怎么样的呢?谢谢rnlong WINAPI OpenComPort(long Port, unsigned char *ComAdr, unsigned char * Baud,long *FrmHandle);
导入DLL时出现DllNotFoundException
各位大侠~~偶在程序中用DllImport导入一个Dll时出现DllNotFoundException,异常帮助器里的提示是:无法加载 DLL“NEsList.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。rnrn我的Dll放在bin目录中的debug文件夹下,这个文件夹里还有一些功能类似的Dll,别的Dll都好使,偏偏这个有问题,真是邪门了!想请教下大侠,这是怎么回事?rnrn小弟很急,有劳各位快些回复~~谢谢!
Mono下C#如何调用linux命令
Mono下C#如何调用linux命令,并将linux命令结果返回到TextBox文本框中rn例如,用一个按钮控制ls -l命令,将linux下执行后的结果返回到前台页面文本框中
C# 调用C/C++ DLL
[code=c]typedef struct IdcInfo rn char name[30+1]; //rn char sex[1+1]; //'1'男 '2'女 rn char nation[2+1]; //民族 '01'-'57'rn char birth[8+1]; //YYYYMMDDrn char addr[70+1];rn char pid[18+1];rn char issue[30+1]; //发卡机关rn char valid_start[8+1]; //rn char valid_end[8+1]; //rn TIdcInfo;rnrn//读身份证,读取成功后,会在当前目录生成xp.bmp照片文件 // iccdll.dllrnSTDAPI ReadIdcInfo(int ReaderHandle, TIdcInfo *pIdcInfo);rnrn[/code]rnrnrn求C#中该如何调用,谢谢!
C#调用C语言的DLL
C#调用C语言实现的DLL时,出现CoTaskMemFree(IntPtr ptr ) 的错误,查了一下,感觉是参数没有对应上,哪位大侠帮我看看是哪里的问题好吗,跪谢~rnrnC语言被调用代码:rntest.dllrn__declspec(dllexport) char* fun(DWORD mode,const char* password);rnchar* fun( DWORD mode, const char* password);rnrnC#调用侧代码:rn static String code;rn [DllImport("test.dll", CharSet = CharSet.Ansi)]rn public static extern String fun(int mode, String password);rnrn static void Main(string[] args)rn rn String s = "123";rn code = obl_crypto_hash(5, s);rn
C#调用C编写dll
[DllImport("P230_DLL_VC.DLL")]rnpublic static unsafe extern int RpcClose();rnrn调用 int a=RpcClose();rn出错:无法在 DLL P230_DLL_VC.DLL 中找到名为 RpcClose 的入口点。rn请教一下如何解决。rn谢谢!
c#调用c语言Dll
程序实现了C语言生成动态链接库,以及C#的调用方法
c# 调用c动态dll
[b][color=#FF0000]请问下面调用正确吗?rn为什么我的程序调用后还是出现SSL初始化错误rnSSLLib.dllrn放在了bin下[/color][/b]rnrn[code=C#]rnint OPENSSL_init(intmode)rnrnrn[/code]rnrnrnrnrn[code=C#][DllImport("SSLLib.dll",CallingConvention=CallingConvention.Cdecl,EntryPoint="OPENSSL_init")]]rnpublic static extern int OPENSSL_init(int mode);rnrnrnrn函数调用rnpublic void test()rnrn //为什么这里初始化会出错?rn int i= OPENSSL_init(0);rnrnrn[/code]rnrnrnrn[color=#FF0000]1楼 bdmh回复:是什么调用约定啊,stdcall还是cdecl,c默认是cdeclrnrnrnrn 答: 是 Cdecl.. 急死我了。 应该本地可以调用阿 为什么会这样 。 1点多就要测试了。rnrnrn2楼 evilant回复:SSL初始化错误,是不是找不到SSLib.dll?rnrnrn 答:rn SSLLib.dll放在程序bin->DeBug下了!rnrn3楼 guliang21 回复 :放到system32下试试rnrn 答:放了 。还是一样rnrn4楼 lizhibin11 大侠:回复:CallingConvention=CallingConvention.Cdecl把这个去掉rn 答: 去掉还是一样rnrn5楼 isjoe回复:是web项目吗?rn 答: winfrom[/color]rnrnrnrn
【C#】调用C语言生成的dll
C#调用C语言生成的dll using System; using System.Runtime.InteropServices; //与导入dll有关的命名空间 using System.Windows.Forms; class Example { //[导入dll,dll与exe在同一个文件夹下]导入dll中getCpuID1函数 [DllImport("CPUID32DLL.dll...
求救: c#调用 c的dll
c#调用 c的dllrn有两个传出参数 char* password,char* corp_idrnrndll内部定义rnunsigned long user_num;rn.....rnsprintf(corp_id,"%06ld",user_num);rnrnunsigned char cur_word,chk_word,pwd_word[17] = ""rn.....rnsprintf(password,"%s",pwd_word);rnrnrn我在c#中用StringBuilder,password得不到值,corp_id得出的值是正确的,是什么原因啊???rn
C#调用C代码DLL
首先我们新建一个C语言的WIN32项目 选择项目类型为DLL库 在新建的项目中我们添加Ccode.h,Ccode.cpp两个文件 Code.h extern &quot;C&quot; __declspec(dllexport) int Minus(int a, int b); extern &quot;C&quot; __declspec(dllexport) int Add(int a, int b); Cc...
c#初学,调用c的dll
c的头文件rnextern "C" void _export _stdcall get_one_yc(int fac, int yc_dot, float *yc_value);rnrnc#调用我这样写rn public class DllTestrn rn [DllImport("BaseDll.dll")]rn private extern static void get_one_yc(int fac, int yc_dot, float *yc_value);rn rnrn提示“指针和和固定大小缓冲区只能在不安全的上下文中使用”,我这样写对吗,要怎么改,之后要如何用这个函数,帮忙写写吧,多谢了
C#调用C DLL异常
最近在开发过程中需要使用C#调用C写的DLL,但在调用过程中遇到这个问题:“尝试读取或写入受保护的内存 这通常指示其它内存已损坏”,出现错误的地方可能为C#定义的结构体与C定义的结构体转换错误。详细如下:rn1.引用外部C的DLL:rn[code=csharp][DllImport(@"C:\Users\Administrator\Documents\visual studio 2010\Projects\CSQLDLL\Debug\CSQLDLL.dll", EntryPoint = "CDBWriteFunc")]rn public static extern int CDBWriteFunc(ref DB_INFO_CTL_TBL dbinfo, [In, Out] USR_INFO_TBL []usrinfo,int count);[/code]rn2.C#中结构体定义:rn[code=csharp][StructLayout(LayoutKind.Sequential)]rn public struct DB_INFO_CTL_TBLrn rn [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byDBName; // DB Namern [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byUsrName; // DB User Namern [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byIPAddr; // IPrn [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byDBPwd; // Passwordrn ;rn [StructLayout(LayoutKind.Sequential)]rn public struct USR_INFO_TBLrn rn [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byName;rn [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]rn public string byAge; rn ;[/code]rn3.C中的函数声明:rn[code=c]__declspec(dllexport) INT __stdcall CDBWriteFunc( DB_INFO_CTL_TBL *dbinfo, USR_INFO_TBL *usrinfotbl,INT count );[/code]rn4.C中的结构体定义:rn[code=c]typedef structrnrn BYTE byDBName[20]; // DB Namern BYTE byUsrName[20]; // DB User Namern BYTE byIPAddr[20]; // IPrn BYTE byDBPwd[20]; // PasswordrnDB_INFO_CTL_TBL;rnrntypedef structrnrn BYTE byName[20]; rn BYTE byAge[20];rnUSR_INFO_TBL;[/code]rnrn抛出“尝试读取或写入受保护的内存 这通常指示其它内存已损坏”的异常,请问大师们这为毛???
C#调用C写的dll
我的步骤是这样的,大家帮忙看看。rn1。把c写的dll拷贝到c#工程的bin的debug下面。rn2。c的头文件如下rnextern "C" rnAMI_UTIL_API long AMI_UTIL_API_CALL getPropertyName(const char* propertyName1, char* propertyName2, int propertyNameLength);rnrn所以,在c#的代码里面,如下rn[DllImport("AmiUtil.dll", EntryPoint = "getPropertyName", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]rnprivate static extern long getPropertyName(string propertyName1, string propertyName2, int propertyNameLength);rn3。调用的时候,我写成如下rnstring str1, str2;rnnPropertyNameLength = 0;rngetPropertyName(str1, str2, nPropertyNameLength))rnrnrn正确的步骤和写法应该是怎么样的?
C#调用C DLL文件
这是我调用的 [DllImport("Zhuzhan.dll", EntryPoint = "IdentityAuthentication", CharSet = CharSet.Ansi)]rn static extern int IdentityAuthentication(string Div,byte[] RandAndEndata);rn他原始提供的是IdentityAuthentication(char* Div,char* RandAndEndata);rn 不过经常报错rnrn运行时遇到了错误。此错误的地址为 0x62ed646b,在线程 0xf9c 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。rnrn
c#怎么调用C的DLL?
有以下疑惑:rn1、c++的dll和c的dll有什么区别?rn2、c#调用c的dll的时候有什么不同?rnrn有人说,c#调用c的dll还要中间加一层c++的封装?rnrn另,我用vc6写以下的代码,有什么错?rnrn[code=C/C++]rn//dll.cpprn#include "Dll.h " rnint add(int a,int b) rn rnreturn a+b; rn rnint subtract(int a,int b) rn rnreturn a-b; rn rnrn[/code]rn[code=C/C++]rn//dll.hrnextern "C " _declspec(dllimport) int add(int a,int b); rnextern "C " _declspec(dllimport) int subtract(int a,int b); rn[/code]
C# 调用 C 写的DLL
'int __stdcall GetBasicInfo(HANDLE icdev,unsigned long &CardSN); rnPrivate Declare Function GetBasicInfo Lib "CMCC.dll" (ByVal icdev,ByRef CardSN&) As Longrn rn上面是 VB 6.0 中调用 C DLL的代码 rn------------------------------------------------------------------------------------ rn那么 C# 遇到 &CardSN 该怎么写呢,请教,不胜感激 rn
C#调用C的dll的CString的问题
拿到的dll是C++写的,里面有CString的数据类型,用C#该怎么用呢?高手指正一下。
关于C#调用C写的Dll的问题
C API声明如下:rnint WINAPI SMGPSendSingle( rn int nNeedReport,rn int nMsgLevel,rn const char* sServiceID,rn int nMsgFormat,rn const char* sFeeType,rn const char* sFeeCode,rn const char* sFixedFee, rn const char* sValidTime,rn const char* sAtTime,rn const char* sSrcTermID,rn const char* sChargeTermID,rn const char* sDestTermID,rn int nMsgLen,rn const char* sMsgContent,rn char* sMsgID,rn int* pnErrorCode,rn char* pMsgType = NULL,rn char* pReserved = NULL,rn const int* pTP_pid = NULL,rn const int* pTP_udhi = NULL,rn const char* pLinkID = NULL,rn const char* pMsgSrc = NULL,rn const int* pChargeUserType = NULL,rn const int* pChargeTermType = NULL,rn const char* pChargeTermPseudo =NULL,rn const int* pDestTermType = NULL,rn const char* pDestTermPseudo = NULL,rn const int* pPkTotal = NULL,rn const int* PkNumber = NULL,rn const int* pSubmitMsgType = NULL,rn const int* pSPDealResult = NULL, rn const char* pMServiceID = NULLrn );rnrn我用C#写的调用代码如下:rn[DllImport("SmgpDll.dll", EntryPoint = "SMGPSendSingle")]rn private static extern int SMGPSendSingle( rn int nNeedReport,int nMsgLevel,string sServiceID,int nMsgFormat,string sFeeType,string sFeeCode, //[7]rn string sFixedFee,string sValidTime,string sAtTime,string sSrcTermID,string sChargeTermID, //[22]rn string sDestTermID,int nMsgLen,string sMsgContent,rn [Out]StringBuilder sMsgID, ref int pnErrorCode, StringBuilder pMsgType, StringBuilder pReserved, ref int pTP_pid,rn ref int pTP_udhi, string pLinkID, string pMsgSrc, ref int pChargeUserType,rn ref int pChargeTermType, string pChargeTermPseudo, ref int pDestTermType, string pDestTermPseudo,rn ref int pPkTotal, ref int PkNumber, ref int pSubmitMsgType, ref int pSPDealResult, string pMServiceID);rnrn每次调用就报"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"rn请高手解答
C#调用C/C++ dll问题
C/C++ DLL里的函数定义:rnextern "C" __declspec(dllexport) int __stdcall pfs_login (char request[], char response[],int bufSize, char address[]);rnresponse是输出参数,其他的全部是输入参数rnrn在c#里怎么调用这个dll,不知道怎么写。谢谢。
C# 调用 C/C++ DLL的问题!
方法都能成功调用,但是回调函数都不能调用,我用的委托。
c# 调用c/c++ dll 参数问题
该文章纯属笔记,遇到一个问题,就在纪录到这里,方便以后的查询。 1:我们有时候想得到c/c++ 参数的返回值。(2016-10-13)              C/C++函数原型:                    MotionControl(char *command,char *confirm,char *message);             此处我们想获取mess
C#调用C的dll文件问题
现在我有个C写的c.dll文件,想在C#里调用,有一个函数是传给结构体的,不知道在C#中怎么写这函数。rn这个函数是:rnint initialize(CCallbackInterface *CCallbackInterface)rn参数名 类型 描述rnCCallbackInterface CCallbackInterface* 回调函数指针结构体rnrn我在c.h里看到CCallbackInterface这结构是:rnrnstruct _CALLBACKINTERFACErn void (*onGetCapabilityToken)(); rn void (*onConnected)(); rn void (*onConnectError)(int reason); rn...rn;rntypedef struct _CALLBACKINTERFACE CCallbackInterface;rnrn现在我在C#中这样用rnpublic struct _CALLBACKINTERFACErn void onGetCapabilityToken(); rn void onConnected(); rn void onConnectError(int reason); rn ...rn rnrn[DllImport("c.dll", EntryPoint = "initialize")] //初始化rn public static extern int initialize(_CALLBACKINTERFACE CCallbackInterface); rnrn我不知道对不对,因为我不知道在窗口cs中调用这个initialize的时候_CALLBACKINTERFACE这个要怎么传,知道的指教下,谢谢
C# 调用C语言DLL问题
我用C# 调用C语言DLL问题rnrnC 给出的例子是:rnEXPORT long _stdcall addCon(int iType ,char *szPar,int iID);rnrn而我C#这么写的:rnpublic static extern long addCon(int iType, string szPar, int iID)rnrn调用出的问题:rn未能从程序集“Couns_Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“Couns_Test.Form1”,因为方法“addCon”没有实现(没有 RVA)。rnrn请问各位,这个问题是怎么解决。rn
C# 调用C/C++ dll 问题
C/C++ rn DWORD _stdcall GetSerialNumrn(rn IN HANDLE hCard, rn OUT BYTE bSerial[NUMLEN] rn);rnrn我写的:rn [DllImport("HS.dll", EntryPoint = "GetSerialNum")]rn public static extern uint GetSerialNum([In]uint handl, [MarshalAs(UnmanagedType.LPArray)] byte[] data);rnrn调用方法:rn byte[] array= new byte[255];rn Common.GetSerialNum(KeyHandle, array);rnrn返回来的array 我用Encoding.Default.GetString(array)转换,拿到的是乱码rn
C#中调用C生成的Dll 问题
C#中调用C生成的Dll,总报程序发生异常错误..不懂为什么..rnC的代码:rnint Sum(int a,int b)rnrn return a+b;rnrnC#中调用的代码:rn class Dllrn rn [DllImport("EssDll.dll",EntryPoint="Sum",rn CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]rn public static extern int Sum(int a,int b);rnrn /// rn /// 应用程序的主入口点。rn /// rn [STAThread]rn static void Main(string[] args)rn rn Console.Write("Dll测试开始\n");rn Console.Write(Sum(5,6).ToString());rn Console.Write("\n前面调用Dll完成!\n");rn string ok = Console.ReadLine();rn rn rnrnC生成Dll是用Cywin来生成的,命令如下:rnEssDll:rn gcc -g -c ./src/EssDll.c -I./include -L./librn dllwrap -o EssDll.dll EssDll.o --def ./src/EssDll.defrn mv ./EssDll.o ./obj/rn mv ./EssDll.dll ./bin/rnrn*.def文件如下:rnLIBRARY EssDllrnEXPORTS rn Sum
C#调用C dll出现的问题
C dll 代码中的输出函数1rnextern "C" __declspec(dllexport) int ConnectServer(char cUser[64],rn char cPass[64],char cIp[32],char cNEName[64]);rnrnC#对应的函数形式我写成如下:rnpublic static extern int ConnectServer(byte[] cUser, byte[] cPass, byte[] cIp, byte[] cNEName);rn rn这样使用:rn byte[] user = new byte[64];rn byte[] password = new byte[64];rn byte[] ip = new byte[32];rn byte[] NEName = new byte[64];rn ConnectServer(user, password, ip, NEName);rnrn最后报错,报错内容:外部组件发生异常,难道是我的参数类型有问题?rnrnrnrnrnC dll 代码中的输出函数2rnextern "C" __declspec(dllexport) void disConnectServer();rnC#对应的函数形式rnpublic static extern void disConnectServer();rn这个连参数也没有,调用后报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。rnrnrn请问大概是什么原因,是我的C dll有问题,还是C#的使用方法有问题,谢谢!
C#调用C语言的dll问题
在C#里面调用一个用C语言写的dll,如果是用C去调用是这样的:rnchar str[256];rnstrcpy(str,"`hello!");rna = (long)str; rn在C#里面不能直接这么用,我把C代码封装成unsafe段,还是解决不了。rnunsafernrnchar str[256];rnstrcpy(str,"`hello!");rna = (long)str;rnrn不知道是用的不对还是这个方法压根行不通。请高手指点,在线等待。谢谢。rn
关于C#调用c的dll是的问题
#define IMAGE_WIDTH (352)rn#define IMAGE_HEIGHT (288)rn uint8_t frameData[65536];rn uint8_t imageRGB[IMAGE_WIDTH* IMAGE_HEIGHT*3];rnrn void* g_dec_handler = h264_dec_init();rn if(!g_dec_handler) return FALSE;rn//开始解码rnwhile(1)。。。。。。。。。。。。。。。。。。rnrn我现在的改写的C#代码是static void Main(string[] args)rn rn const int IMAGE_WIDTH =352;rn const int IMAGE_HEIGHT=288;rn byte [] frameData;rn frameData =new byte [65536];rn byte[] imageRGB;rn imageRGB = new byte[IMAGE_WIDTH * IMAGE_HEIGHT * 3];rn下面就有问题了。。不知怎么写了。。。求大侠解释。在线等。rn
C# 调用C dll文件,无法加载问题
如图在VS中直接引用添加时出现错误。需要直接将dll添加到项目生成的exe同一个文件夹下,或者在Import时采样绝对路径或相对路径方式。
C#调用C/C++ DLL函数问题。
C/C++函数原型为:rnLMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,rn unsigned short usPID,rn LPGUID lpGUID,rn BOOL *pbDriverInstalled);rnLMUSB_HANDLE 定义为 typedef void *LMUSB_HANDLE;rnLPGUID 定义为 typedef GUID *LPGUID;rnGUID 定义为 typedef struct _GUID rn unsigned long Data1;rn unsigned short Data2;rn unsigned short Data3;rn unsigned char Data4[ 8 ];rn GUID;rnrnrnC#中重新声明函数为rn[DllImport("LMUSBDLL_TEST.dll")]rnpublic static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,rn ref bool pbDriverInstalled);rnpublic struct GUIDrnrn private UInt32 Data1;rn private UInt16 Data2;rn private UInt16 Data3;rn [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]rn private Byte[] Data4;rnrn public GUID(UInt32 DT1, UInt16 DT2, UInt16 DT3, Byte []DA4)rn rn this.Data1 = DT1;rn this.Data2 = DT2;rn this.Data3 = DT3;rn this.Data4 = DA4;rn rnrnrn调用如下:rnstatic Byte[] DA4_INITIAL = 0xB7, 0x72, 0xb3, 0xAF, 0x2B, 0x6F, 0xDE, 0x1C ;rnstatic GUID GUID_DEVINTERFACE_STELLARIS_BULK = new GUID(0x6E45736A, 0x2B1B, 0x4078, DA4_INITIAL);rnrnByte []hUSB;rnbool bDriverInstalled = false;rnhUSB = InitializeDevice(IT300_BULK_VID, IT300_BULK_PID, ref GUID_DEVINTERFACE_STELLARIS_BULK, ref bDriverInstalled);rn编译成功,运行出错如下:rnrn未经处理的异常: System.Runtime.InteropServices.MarshalDirectiveException: 无法rn封送处理“return value”: 无效的托管/非托管类型组合。rn 在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16rnusVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)rn 在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置rn E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_rnTest\Program.cs:行号 165rn请按任意键继续. . .rnrnrnInitializeDevice定义如下:rnrnextern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORTrnInitializeDevice(unsigned short usVID,rn unsigned short usPID,rn LPGUID lpGUID,rn BOOL *pbDriverInstalled)rnrnrn return(InitializeDeviceByIndex(usVID, usPID, lpGUID, 0, true,rn pbDriverInstalled));rnrnrnrnrnextern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORTrnInitializeDeviceByIndex(unsigned short usVID,rn unsigned short usPID,rn LPGUID lpGUID,rn DWORD dwIndex,rn BOOL bOpenDataEndpoints,rn BOOL *pbDriverInstalled)rnrnrn BOOL bResult;rn WINUSB_INTERFACE_HANDLE usbHandle;rn USB_INTERFACE_DESCRIPTOR ifaceDescriptor;rn WINUSB_PIPE_INFORMATION pipeInfo;rn UCHAR speed;rn ULONG length;rn DWORD dwError;rn int i;rn tDeviceInfoWinUSB *psDevInfo;rnrn if(!lpGUID || !pbDriverInstalled)rn rn return(NULL);rn rn psDevInfo = (tDeviceInfoWinUSB *)LocalAlloc(LPTR, sizeof(tDeviceInfoWinUSB));rn if(!psDevInfo)rn rn return(NULL);rn rn psDevInfo->deviceHandle = OpenDeviceByIndex(dwIndex, lpGUID);rn if(psDevInfo->deviceHandle == INVALID_HANDLE_VALUE)rn rn dwError = GetLastError();rn *pbDriverInstalled = (dwError == ERROR_DEV_NOT_EXIST) ? FALSE : TRUE;rn LocalFree((HLOCAL)psDevInfo);rn return(NULL);rn rnrn bResult = WinUsb_Initialize(psDevInfo->deviceHandle, &usbHandle);rn if(bResult)rn rn psDevInfo->winUSBHandle = usbHandle;rn length = sizeof(UCHAR);rn bResult = WinUsb_QueryDeviceInformation(psDevInfo->winUSBHandle,rn DEVICE_SPEED,rn &length,rn &speed);rn rnrn if(bOpenDataEndpoints)rn rnrn if(bResult)rn rn psDevInfo->deviceSpeed = speed;rn bResult = WinUsb_QueryInterfaceSettings(psDevInfo->winUSBHandle,rn 0,rn &ifaceDescriptor);rn rnrn if(bResult)rn rn for(i=0;iwinUSBHandle, 0, (UCHAR) i,rn &pipeInfo);rnrn if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&rn USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))rn rn psDevInfo->bulkInPipe = pipeInfo.PipeId;rn rn else if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&rn USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))rn rn psDevInfo->bulkOutPipe = pipeInfo.PipeId;rn rn elsern rn SetLastError(ERROR_NOT_SAME_DEVICE);rn bResult = FALSE;rn break;rn rn rn rnrn if(bResult)rn rn psDevInfo->hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);rnrn if(psDevInfo->hReadEvent)rn rn bResult = true;rn rn rn rn elsern rn psDevInfo->bulkOutPipe = 0;rn psDevInfo->bulkInPipe = 0;rn psDevInfo->hReadEvent = NULL;rn rnrn if(bResult)rn rn return((LMUSB_HANDLE)psDevInfo);rn rn elsern rn LocalFree((HLOCAL)psDevInfo);rn return(NULL);rn rnrnrn求教各路大虾,如何解决“无法封送处理“return value”: 无效的托管/非托管类型组合。”的问题?
C#中调用c生成dll问题
如有xx.dll,rn在c代码中,rn函数为:rninter* add (inter * a , inter *b);rn其中inter为结构体。rn用c#调用rnclase interrn[StructLayout(LayoutKind.Sequential)]rnrn...rnrn[DllImport("xx.dll")]rnrn public extern static (返回值) add ((返回值), (返回值));rnrn该函数返回值应该怎么写,参数应该怎么写。因为c代码中定义的该函数返回值和参数都是指针。rn
C#调用C动态DLL问题
我的系统为2003,用C写的DLL类库,C#的窗体去调用,没有问题。rn同样的项目,拿到XP系统下,调用就出现异常。rn这是部分错误信息.rnrn 有关调用实时(JIT)调试而不是此对话框的详细信息,rn请参见此消息的结尾。rnrn************** 异常文本 **************rnSystem.Runtime.InteropServices.COMException (0x8007007A): 传递给系统调用的数据区域太小。 (异常来自 HRESULT:0x8007007A)rnrn
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数