【发布时间】:2014-04-02 14:38:46
【问题描述】:
我正在尝试构建一个 COM 客户端,它必须在 C# 中实例化一个进程内 COM 服务器。 我做了两个 C# 项目:一个用于客户端,一个用于服务器。两个项目都使用 x86 目标平台,后者设置了“Register for COM interop”选项。我在 64 位 Windows 7 上使用 Visual Studio 2013 并使用 .net 4 进行编译。
这是服务器代码:
using System.Runtime.InteropServices;
namespace ComRibbonApplicationMenuServer
{
[ComVisible(true)]
[Guid("CCF43AAC-0822-4C36-90FD-2AFF7B94E71D")]
public interface IComRibbonApplicationMenuServer
{
[DispId(1)]
int OpenWindow();
}
[ComVisible(true)]
[Guid("38B1DE85-BC15-48E1-AFAF-4A7EA506256B")]
[ClassInterface(ClassInterfaceType.None)]
public class ComRibbonApplicationMenuServerClass : IComRibbonApplicationMenuServer
{
public ComRibbonApplicationMenuServerClass()
{
// Needed for COM
}
public int OpenWindow()
{
return 33;
}
}
}
这是客户端:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ComRibbonApplicationMenuClient
{
[Guid("CCF43AAC-0822-4C36-90FD-2AFF7B94E71D")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface IComRibbonApplicationMenuServer
{
void OpenWindow();
}
[ComImport, Guid("38B1DE85-BC15-48E1-AFAF-4A7EA506256B")]
class ComRibbonApplicationMenuServerClass
{
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ComRibbonApplicationMenuServerClass comServerClass = new ComRibbonApplicationMenuServerClass();
IComRibbonApplicationMenuServer comServer = (IComRibbonApplicationMenuServer)comServerClass;
comServer.OpenWindow();
}
}
}
指令new ComRibbonApplicationMenuServerClass(); 抛出InvalidCastException HResult=-2147467262。
我能做什么?
编辑:
感谢汉斯的回答。
如果我理解正确,正如我所怀疑的那样,如果没有一些黑客攻击,就不允许为 dotnet COM 服务器创建 dotnet COM 客户端。
正如您所猜想的那样,我正在尝试做的是测试一个 dotnet 程序,我发现该程序在作为独立应用程序执行时可以正常工作,但在由另一个应用程序执行时会崩溃(仅在 Windows XP 中)通过 COM。
为了重现该问题,我需要构建一个简单的测试程序,该程序必须启动服务器并调用一个方法来执行一些可能导致堆栈溢出异常的指令。这两个程序都使用了 GUI,这可能是问题的一部分。
为了简单起见,我首先尝试为 COM 客户端制作 winform 程序,但是,阅读您的回答后,我想我必须制作一个 MFC 应用程序来测试 COM 场景。你怎么看?
【问题讨论】:
标签: c# .net visual-studio com