C# 无法运行非常简单的COM客户端 当我尝试为C++写的一个非常简单的COM服务器运行一个非常简单的COM客户端时,我会遇到各种各样的错误。COM服务器是用C++编写的,只有一个方法GETSoFipe。我构建了COM服务器的ocx,使用regsrv32注册,并从以下C控制台应用程序引用它: using System; using System.Windows.Forms; using AxSimpleActiveXControlLib; class Program { [STAThread] static void Main() { var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl(); var form = new Form { Controls = { c } }; form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString()); Application.Run(form); } } 使用MySimpleActivexControlLib; 名称空间SimpleConsoleApp { 班级计划 { 静态环[]args { var c=新的MySimpleActivexControlLib.MySimpleActivexControl; c、 GetSomeString; } } }

C# 无法运行非常简单的COM客户端 当我尝试为C++写的一个非常简单的COM服务器运行一个非常简单的COM客户端时,我会遇到各种各样的错误。COM服务器是用C++编写的,只有一个方法GETSoFipe。我构建了COM服务器的ocx,使用regsrv32注册,并从以下C控制台应用程序引用它: using System; using System.Windows.Forms; using AxSimpleActiveXControlLib; class Program { [STAThread] static void Main() { var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl(); var form = new Form { Controls = { c } }; form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString()); Application.Run(form); } } 使用MySimpleActivexControlLib; 名称空间SimpleConsoleApp { 班级计划 { 静态环[]args { var c=新的MySimpleActivexControlLib.MySimpleActivexControl; c、 GetSomeString; } } },c#,visual-studio-2010,visual-c++,com,com-interop,C#,Visual Studio 2010,Visual C++,Com,Com Interop,运行代码时,会出现以下异常: 类型的未处理异常 mscorlib.dll中出现“System.Runtime.InteropServices.COMException” 其他信息:来自HRESULT的灾难性故障异常: 0x8000FFFF E_意外 我尝试使用C++控制台应用程序的组件,并得到另一个错误: 。。。微软C++异常:内存位置0x00 2bf5e4的μCOMILIOLT错误 可以查看完整的代码。 任何帮助都将不胜感激。这当然取决于ActiveX控件内部的内容,但您尚未显示任何代码 例

运行代码时,会出现以下异常:

类型的未处理异常 mscorlib.dll中出现“System.Runtime.InteropServices.COMException”

其他信息:来自HRESULT的灾难性故障异常: 0x8000FFFF E_意外

<>我尝试使用C++控制台应用程序的组件,并得到另一个错误:

。。。微软C++异常:内存位置0x00 2bf5e4的μCOMILIOLT错误

可以查看完整的代码。
任何帮助都将不胜感激。

这当然取决于ActiveX控件内部的内容,但您尚未显示任何代码

例如,该控件可能需要一个STA线程在其上运行,并由ActiveX友好容器正确托管,而测试控制台应用程序并不是这样做的。从WinForms应用程序中尝试:

using System;
using System.Windows.Forms;
using AxSimpleActiveXControlLib;

class Program
{
    [STAThread]
    static void Main()
    {
        var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl();

        var form = new Form
        {
            Controls = { c }
        };

        form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString());

        Application.Run(form);
    }
}
这也可能有助于:

已更新,添加对MFC ActiveX控件的引用时,应通过Visual Studio WinForms工具箱添加该控件,或使用AxImp.exe工具:


这样,它将生成AXSimpleActivExcollib.dll和SimpleActivExcollib.dll。前者将包含ActiveX控件的System.Windows.Forms.Control派生包装。将两者都添加到您的项目中,然后尝试我上面发布的代码,该代码根据您发布的源代码进行了更新。

这当然取决于ActiveX控件内部的内容,但您尚未显示任何代码

例如,该控件可能需要一个STA线程在其上运行,并由ActiveX友好容器正确托管,而测试控制台应用程序并不是这样做的。从WinForms应用程序中尝试:

using System;
using System.Windows.Forms;
using AxSimpleActiveXControlLib;

class Program
{
    [STAThread]
    static void Main()
    {
        var c = new AxSimpleActiveXControlLib.AxSimpleActiveXControl();

        var form = new Form
        {
            Controls = { c }
        };

        form.Load += (s, e) => MessageBox.Show(c.GetSomeNumber().ToString());

        Application.Run(form);
    }
}
这也可能有助于:

已更新,添加对MFC ActiveX控件的引用时,应通过Visual Studio WinForms工具箱添加该控件,或使用AxImp.exe工具:


这样,它将生成AXSimpleActivExcollib.dll和SimpleActivExcollib.dll。前者将包含ActiveX控件的System.Windows.Forms.Control派生包装。将两者都添加到您的项目中,然后尝试我上面发布的代码,该代码根据您发布的源代码进行了更新。

您是否考虑过使用调试器查看引发异常的原因?@RaymondChen感谢您的回复。在C控制台中,一旦引发异常,这就是运行堆栈的顶部:1。mscorlib.dll!System.RuntimeType.ForwardCallToInvokeMemberstring成员名称,System.Reflection.BindingFlags标志,对象目标,int[]aWrapperTypes,ref System.Runtime.Remoting.Proxies.MessageData msgData+0x183字节2。[本机到托管转换]3。[管理到本机转换]4。SimpleConsoleApp.exe!SimpleConsoleApp.Program.Mainstring[]args第11行+0x9字节C编辑:很抱歉,格式不正确,我正在尝试更合理地格式化堆栈帧。我还尝试在VirtualBox上运行Windows 7的干净安装,然后将VS 2010安装为唯一的软件安装,但仍然会收到相同的错误。该方法返回了意外的E_。您需要调试C++服务器,看看它为什么返回EA意外。或者调试控制台应用程序以查看它引发_com_错误的原因。我无法使用调试器进入相关行,我立即得到异常。从调用堆栈System.RuntimeType.ForwardCallToInvokeMember顶部的函数的名称,我怀疑在访问C++服务器之前返回了错误。哦,COM服务器和客户端都在同一个VC解决方案中,服务器的符号在我开始调试客户端时加载。您是否考虑过使用调试器来查看引发异常的原因?@RaymondChen感谢您的回答。在C控制台中,一旦引发异常,这就是运行堆栈的顶部:1。mscorlib.dll!System.RuntimeType.ForwardCallToInvokeMemberstring成员名称,System.Reflection.BindingFlags标志,对象目标,int[]aWrapperTypes,ref System.Runtime.Remoting.Proxies.MessageData msgData+0x183字节2。[本机到托管转换]3。[管理到本机转换]4。SimpleConsoleApp.exe!SimpleConsoleApp.Program.Mainstring[]args第11行+0x9字节C编辑:很抱歉格式不正确,我正在尝试更合理地格式化堆栈帧。我还尝试在VirtualBox上运行Windows 7的干净安装,然后将VS 2010安装为唯一的软件安装,但仍然收到相同的错误。该方法返回了意外的E_
你需要调试C++服务器,看看它为什么返回EA意外。或者调试控制台应用程序以查看它引发_com_错误的原因。我无法使用调试器进入相关行,我立即得到异常。从调用堆栈System.RuntimeType.ForwardCallToInvokeMember顶部的函数的名称,我怀疑在访问C++服务器之前返回了错误。哦,COM服务器和客户端都在同一个VC解决方案中,服务器的符号在我开始调试客户端时加载。感谢您的回复。我使用VS2010创建了Activex控件,方法是使用默认设置创建一个新的MFC Activex控件项目,然后使用类视图->右键单击IDL文件->添加方法向控件添加一个方法。你需要更多的细节吗?我可以添加代码,但它99%都是在VS@JohnnyW中创建的样板文件,当你像我建议的那样用WinForms测试它时会发生什么?另外,GetSomeString到底是什么样子的?我试图使用您提出的方法,但遇到了一个编译错误:无法从“SimpleActivExcollib.SimpleActivExcoll”转换为“System.Windows.Forms.Control”,谢谢您的回答。我使用VS2010创建了Activex控件,方法是使用默认设置创建一个新的MFC Activex控件项目,然后使用类视图->右键单击IDL文件->添加方法向控件添加一个方法。你需要更多的细节吗?我可以添加代码,但它99%都是在VS@JohnnyW中创建的样板文件,当你像我建议的那样用WinForms测试它时会发生什么?另外,GetSomeString到底是什么样子的?我试图使用您提出的方法,但遇到了一个编译错误:无法将“SimpleActivExcollib.SimpleActivExcoll”转换为“System.Windows.Forms.Control”