急求大神帮助!!C#调用C++dllSystem.AccessViolationException”类型的未经处理的异常出现在 mscorlib.dll 中。

yi_chuan_yang 2015-04-15 03:12:58
“System.AccessViolationException”类型的未经处理的异常出现在 mscorlib.dll 中。

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
代码如下
//////C++ dll 代码

HWND hWnd;
extern "C" __declspec(dllexport) void cOSG(HWND mhWnd)
{
hWnd=mhWnd;
}
extern "C" __declspec(dllexport) void InitOSG()
{
。。。。
}
////////C#代码
[DllImport("viewdll.dll")]
public static extern void InitOSG();
[DllImport("viewdll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void cOSG(IntPtr mhWnd);
//////调用
private void Form1_Load(object sender, EventArgs e)
{
Class1.cOSG(this.panel1.Handle);
}

private void button1_Click(object sender, EventArgs e)
{
Thread aThread = new Thread(new ThreadStart(Class1.InitOSG));
aThread.Start();
}

运行时出现
在 System.AccessViolationException 中第一次偶然出现的“mscorlib.dll”类型的异常
“System.AccessViolationException”类型的未经处理的异常出现在 mscorlib.dll 中。

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

有什么问题呢??????
...全文
734 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
-小蕾- 2015-04-23
  • 打赏
  • 举报
回复
引用 3 楼 u011347730 的回复:
[quote=引用 2 楼 zyl_leilei 的回复:]

//c++函数强制声明
        [DllImport("mi.dll", EntryPoint = "API_OpenComm")]
        public static extern IntPtr API_OpenComm(int nCom, int nBaudrate);

        [DllImport("mi.dll", EntryPoint = "API_CloseComm")]
        public static extern bool API_CloseComm(IntPtr commHandle);

        [DllImport("mi.dll", EntryPoint = "API_ControlBuzzer")]
        public static extern int API_ControlBuzzer(IntPtr commHandle, int DeviceAddress, byte freq, byte duration, ref byte buffer);

        [DllImport("mi.dll", EntryPoint = "API_MF_Read")]
        public static extern int API_MF_Read(IntPtr commHandle, int DeviceAddress, byte mode, byte blk_add, byte num_blk, ref byte snr, ref byte buffer);

        private void Form1_Load(object sender, EventArgs e)
        {
            Program.Port = API_OpenComm(4, 9600);
            if (Program.Port.ToInt32() == 0)
            {
                labelControl2.Visible = false;
                labelControl3.Visible = true;
                buttonX1.Visible = true;
                return;

            }
            byte pBuf = new byte();
            Program.G_start = API_ControlBuzzer(Program.Port, 0, 3, 1, ref pBuf);
            if (Program.G_start == 0)
            {
                labelControl2.Visible = true;
                labelControl3.Visible = false;
                buttonX1.Visible = false;
            }
            //启动时间轴
            timer1.Interval = 1000;
                timer1.Start();
        }
我的错在哪了 呢 该如何修改[/quote] 为什么要Class1.InitOSG?你上面声明的c++函数跟下面的Load和button1_Click不是在一个类里面吗? 不行你调试一下看看是哪句代码出了问题。。。
yi_chuan_yang 2015-04-16
  • 打赏
  • 举报
回复
引用 2 楼 zyl_leilei 的回复:

//c++函数强制声明
        [DllImport("mi.dll", EntryPoint = "API_OpenComm")]
        public static extern IntPtr API_OpenComm(int nCom, int nBaudrate);

        [DllImport("mi.dll", EntryPoint = "API_CloseComm")]
        public static extern bool API_CloseComm(IntPtr commHandle);

        [DllImport("mi.dll", EntryPoint = "API_ControlBuzzer")]
        public static extern int API_ControlBuzzer(IntPtr commHandle, int DeviceAddress, byte freq, byte duration, ref byte buffer);

        [DllImport("mi.dll", EntryPoint = "API_MF_Read")]
        public static extern int API_MF_Read(IntPtr commHandle, int DeviceAddress, byte mode, byte blk_add, byte num_blk, ref byte snr, ref byte buffer);

        private void Form1_Load(object sender, EventArgs e)
        {
            Program.Port = API_OpenComm(4, 9600);
            if (Program.Port.ToInt32() == 0)
            {
                labelControl2.Visible = false;
                labelControl3.Visible = true;
                buttonX1.Visible = true;
                return;

            }
            byte pBuf = new byte();
            Program.G_start = API_ControlBuzzer(Program.Port, 0, 3, 1, ref pBuf);
            if (Program.G_start == 0)
            {
                labelControl2.Visible = true;
                labelControl3.Visible = false;
                buttonX1.Visible = false;
            }
            //启动时间轴
            timer1.Interval = 1000;
                timer1.Start();
        }
我的错在哪了 呢 该如何修改
-小蕾- 2015-04-16
  • 打赏
  • 举报
回复

//c++函数强制声明
        [DllImport("mi.dll", EntryPoint = "API_OpenComm")]
        public static extern IntPtr API_OpenComm(int nCom, int nBaudrate);

        [DllImport("mi.dll", EntryPoint = "API_CloseComm")]
        public static extern bool API_CloseComm(IntPtr commHandle);

        [DllImport("mi.dll", EntryPoint = "API_ControlBuzzer")]
        public static extern int API_ControlBuzzer(IntPtr commHandle, int DeviceAddress, byte freq, byte duration, ref byte buffer);

        [DllImport("mi.dll", EntryPoint = "API_MF_Read")]
        public static extern int API_MF_Read(IntPtr commHandle, int DeviceAddress, byte mode, byte blk_add, byte num_blk, ref byte snr, ref byte buffer);

        private void Form1_Load(object sender, EventArgs e)
        {
            Program.Port = API_OpenComm(4, 9600);
            if (Program.Port.ToInt32() == 0)
            {
                labelControl2.Visible = false;
                labelControl3.Visible = true;
                buttonX1.Visible = true;
                return;

            }
            byte pBuf = new byte();
            Program.G_start = API_ControlBuzzer(Program.Port, 0, 3, 1, ref pBuf);
            if (Program.G_start == 0)
            {
                labelControl2.Visible = true;
                labelControl3.Visible = false;
                buttonX1.Visible = false;
            }
            //启动时间轴
            timer1.Interval = 1000;
                timer1.Start();
        }
yi_chuan_yang 2015-04-15
  • 打赏
  • 举报
回复
没有大神指教么
Json.NET 描述: json。 网络是一个流行的高性能JSON为。NET框架 灵活的JSON序列化器对之间的转换。净对象和JSON linq到JSON用于手动阅读和写作JSON 高性能,速度比。净的内置JSON序列化器 写缩进,容易阅读JSON JSON和XML之间进行转换 支持: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store 版本: Json.NET has different libaries for the various .NET Framework versions. -Net45: .NET latest (4.5) -Net40: .NET 4.0 -Net35: .NET 3.5 -Net20: .NET 2.0 -WinRT: Windows 8 Store -Portable45: .NET 4.5, Windows Phone 8, Windows 8 Store -Portable40: .NET 4.0, Windows Phone 7, Windows 8 Store, Silverlight 4 Notes: Microsoft stopped support for the Compact Framework in Visual Studio 2010. For a Compact Framework 3.5 build download Json.NET 3.5. For a Silverlight 3.0 build download Json.NET 3.5. Microsoft Visual Studio 2010 重新生成解决方案的一些警告处理 警告 2 预定义类型“System.Action”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 3 预定义类型“System.Action”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 4 预定义类型“System.Action”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 5 预定义类型“System.Action”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 6 预定义类型“System.Func”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 7 预定义类型“System.Func”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 8 预定义类型“System.Func”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 9 预定义类型“System.Func”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 警告 10 预定义类型“System.Func”是在全局别名的多个程序集定义的;将使用“c:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework \v4.0\mscorlib.dll的定义 ClassLibrary1 问题原因:检查程序发现,由于项目引用了Newtonsoft.Json.Net20,从而造成系统的类重名(项目FRAMEWORK的版本4.0)。 Newtonsoft.Json.Net 包括: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store,所有dll文件和源码,有需要的同学可以直接下载。 个人网站多多支持:www.mlyuansu.com
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的间语言(IL),是包在一个或多个DLL或可执行文件的。   基于ILDASM检查程序集的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集类及其成员的概要信息、提供查看程序集IL的能力以及提供对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口与其它默认程序集共同显示。要想从Reflector的主窗口删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行的程序集、输出整个程序集的反汇编内容以及在Visual Studio作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005添加“Go to Reflector”和一个帮助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual StudioReflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序的所有功能还可以寄于Visual Studio。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱必不可少的精髓工具之一。怎么样,请赶紧试锋吧。

110,536

社区成员

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

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

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