通过反射使用COM对象接口

时间:2018-11-26 14:10:28

标签: reflection interface com+

我在动态使用COM对象时遇到了一些问题,而没有在我的项目中添加Assembly作为参考。

问题是,我将在不一定安装了这些程序集的某些计算机中使用我的应用程序,并且由于它们是COM +应用程序,因此需要从服务器加载它们。 因此,为此,我使用以下代码:

  Type _ObjectType;
        Type ObjectType
        {
            get
            {

                _ObjectType= Type.GetTypeFromProgID(APP_NAME, server);
                if (_ObjectType!= null)
                    return _ObjectType;


                _ObjectType= Type.GetTypeFromCLSID(new Guid(CLSID), server);
                if (_ObjectType!= null)
                    return _ObjectType;


                throw new Exception("Error al obtener instancia de " + APP_NAME + " en " + server);
            }
        }


         object _InstanceObject;
         object InstanceObject
        {
            get
            {


                if (ObjectType!= null)
                {
                    _InstanceObject= Activator.CreateInstance(ObjectType);
                }


                if (_InstanceObject!= null)
                    return _InstanceObject;
                else
                    throw new Exception("Error al obtener instancia de Object");
            }
        }

这时,我有一个该COM + Aplication的实例,而没有将那些程序集添加为对我的项目的引用,我可以使用反射来调用和使用这些实例的方法,如下所示:

//The method I'm calling have two arguments, one ByVal and one ByRef
 object[] args = new object[]
                     {
                         arg1,
                        arg2
                     };

ParameterModifier modifier = new ParameterModifier(2);

                modifier[0] = false;
                modifier[1] = false;


ParameterModifier[] mods = { modifier };

dynamic Result = (dynamic)ObjectType.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, InstanceObject, args, mods, null, null);

在这里,很好,实际上,我可以在任何具有服务器访问权限的计算机上使用myy应用程序,并获得方法的结果。

但是,问题来了。

COM +应用程序具有一个接口,并且该接口具有一些我需要调用的方法,但是使用以前的方法我无法做到,出现以下错误:

  
      
  • $ exception {“未知名称。(HRESULT的异常:0x80020006(DISP_E_UNKNOWNNAME))”} System.Runtime.InteropServices.COMException
  •   

所以,我在想,也许该接口不是公共的或类似的东西,而我无法以这种方式访问​​,所以,我尝试通过将程序集添加为参考并创建一个COM对象的传统实例。界面:

        MySpaceName.IMyInterface ComInterfaceInstance = new MySpaceName.IMyInterface();
        ComInterfaceInstance.MyMethod(arg1, ref arg2);

但是C#告诉我有一个错误:

  

无法创建类或抽象接口的实例   “ IMyInterface”

因此,我尝试创建主COM +对象的实例,然后将该对象强制转换为具有所需方法的接口,如下所示:

 MySpaceName.MyObject a = new  MySpaceName.MyObject();

string param1 = "Param1";
object parm2 = new object();

((MySpaceName.IMyInterface)a).MyInterfaceMehthod(param1, ref parm2 );

这很好,强制转换正常,该方法在param2变量中给出了结果。但是再次,对于我的项目来说这是不可行的,因为我无法添加这些程序集作为参考。

我需要清除这些COM +应用程序是Delphi DLL,而不是.NET程序集。

那么....有什么方法可以使用接口名称作为字符串将创建的实例转换为所需的接口?用反射调用接口方法的一种方法?

类似的东西:

dynamic Result = (dynamic)ObjectType.InvokeMember("IMyInterface.MyMethod", BindingFlags.InvokeMethod, null, InstanceObject, args, mods, null, null);

或者某种允许我调用接口方法的东西?

有人可以帮助我吗?

好的,谢谢您的阅读,

0 个答案:

没有答案