Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# COM+;远程实例中调用方法的未知名称错误_C#_.net_Com_Remoting - Fatal编程技术网

C# COM+;远程实例中调用方法的未知名称错误

C# COM+;远程实例中调用方法的未知名称错误,c#,.net,com,remoting,C#,.net,Com,Remoting,我有一个COM dll,我通过互操作引用在.net项目中使用它。现在我需要将这个COM组件移动到另一个远程机器上,并在那里创建实例(类似于进程外,可能是远程处理,我不知道:-)) 我所做的是在服务器机器中创建一个新的COM+应用程序。已在此应用程序中添加此组件。这是它在服务器上的COM+接口中列出的方式。 将此应用程序作为代理insatller导出并安装在我的客户端计算机中。使用以下代码 访问此 Type type; type = Type.GetTypeFromProgID("DllName

我有一个COM dll,我通过互操作引用在.net项目中使用它。现在我需要将这个COM组件移动到另一个远程机器上,并在那里创建实例(类似于进程外,可能是远程处理,我不知道:-))

我所做的是在服务器机器中创建一个新的COM+应用程序。已在此应用程序中添加此组件。这是它在服务器上的COM+接口中列出的方式。

将此应用程序作为代理insatller导出并安装在我的客户端计算机中。使用以下代码 访问此

Type type;
type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var returnValue = COMObject.GetType().InvokeMember("Method_1",   BindingFlags.Public |  BindingFlags.InvokeMethod, null, COMObject, new object[1] { "1" });

但是我在调用方法_1时遇到未知名称(0x80020006)错误?如果您以前遇到过类似的问题,请帮助我。

调用该方法时不需要使用GetType()
COMObject.InvokeMember()
应该足够了

另外,尝试使用
.GetTypeFromCLSID()
-而不是ProgID从ClassID获取类型


另外,不要使用
BindingFlags.Public
而使用
BindingFlags.Default
。这将指定所有类型成员都可用。

如果在客户端计算机中正确安装并配置了应用程序代理,则应该能够在创建任何其他对象实例时实例化COM+

试试这个:

IMyExpectedInterface o = new MyCOMServicedComponent();
o.SomeMethod();

如果运行不正常,请在实例化时告诉我您得到的异常结果。

我要做的是:

1) 在C#中创建等效接口,如下所示:

[Guid("<the interface IID goes here>")]
public interface ISomeInterfaceName
{
   int Method1(...);
   int Method2(...);
   int Method3(...);
   ...
}
注意:IID必须是接口中的IID,不要与CLSID混淆。方法的布局应与COM方法完全对应(方法顺序很重要,参数和返回类型的定义方式也很重要)


如果您有很多这样的类和接口,也可以从COM组件中访问。

为什么要使用System.Reflection.BindingFlags.CreateInstance标志?应该改为InvokeMethod。很抱歉,我犯了错误,我只使用了BindingFlags.InvokeMethod。仍然是相同的错误您是否尝试过1)在C#中定义ISomeInterfaceName接口(具有与IID#U ISomeInterfaceName和3个方法相对应的Guid属性),2)将COMObject强制转换到此接口,以及3)在此接口上调用Method2。此Guid是否需要与远程服务器中组件的CLSID相同或其他内容?否,它必须与服务器的IID(接口ID)相同ISomeInterfaceName@hugh-COM不支持“静态”方法:-)方法_1不是静态方法COM+代理在我的计算机中安装良好。我是否需要添加程序集引用以使上述代码正常工作?两台计算机是否在同一个域中?是的,它们都在同一个域中。@Simon Mourier,其中一个方法是返回字符串。但是当以这种方式实现时,它总是返回null。知道为什么吗?@Shanadas-你在C#中的方法定义可能不正确。它与COM不匹配。您还可以检查PreserveSigAttribute自定义属性。我重新检查了,方法定义正确,只包括PreserveSigAttribute,但仍然返回nullvalue@Shanadas-很难说没有任何代码。还检查了字符串参数上的MarshalAs属性吗?否则,您应该问另一个问题,并提供详细信息。
Type type = Type.GetTypeFromProgID("DllName.COMName", "serverName", false);
var COMObject = Activator.CreateInstance(type);
var if = (ISomeInterfaceName)COMObject;
if.Method1(...);