Win32com.client.dispatch Python调用C#中的等效

时间:2017-11-13 15:00:52

标签: c# python dll dispatch

我有供应商提供给我的第三方动态链接库。该库是面向对象的。我目前正尝试从.Net或C#访问此库,但是,在尝试调用方法时,.Net中没有可用的方法。 这些库的支持由使用Python的程序员提供。 这是我给出的Python示例:

import win32com.client
OLSV = Win32com.client.Dispatch("LsvEmu.LsvEmulator")
OLSV.BaseUnit

以下是我在C#中试过的内容

using System;
using LsvComLib;
using System.Reflection;
using System.Reflection.Emit;
using LsvEmuLib;


namespace LsvDemo
{
    class Program
    {
        static void TestEmu()
        {
           //LsvEmu should include Connect, and ConnectEx methods
            var lsvEmu = new LsvEmulator();
           //EmulationMode is a property, and all that is available other 
            than ToString, etc
            Console.WriteLine(lsvEmu.EmulationMode);

            //Attempt to use reflection to find a Dispatch equivalent in C#
            Type mytype = (typeof(LsvEmulator));
            //public
            //No further methods found
            MethodInfo[] myArrayMethodInfo = mytype.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            DisplayMethodInfo(myArrayMethodInfo);

            //private
            //No further methods found
            MethodInfo[] myArrayMethodInfo1 = mytype.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
            // Display information for all methods.
            DisplayMethodInfo(myArrayMethodInfo1);  
        }
}

Python Dispatch调用的适当等价物是什么? 此外,为什么通过反思无法获得预期的方法? 看来该软件供应商可能无法访问所有原始源代码,因此我不确定它们会有多大帮助。这个库旨在模拟他们给我们的另一个库,它们对他们的设备进行以太网调用。如果缺少通过反射显示的可用方法是由于实现不佳,我们可能会构建自己的模拟器。

1 个答案:

答案 0 :(得分:0)

我最近使用.net core 2及更高版本中的内置COM支持为类似情况实现了.net解决方案。该解决方案是免注册的。您仍然需要弄清楚所获得的数据类型是什么,但是objectdynamic类型可以帮助您解决这一问题。

因此,与Python Dispatch等效为两行。

Type type = Type.GetTypeFromProgID("LsvEmu.LsvEmulator");
object inst = Activator.CreateInstance(type);

现在您已经有了应用方法的程序和界面。要从中获取属性,可以通过Bindingflag.GetProperty调用InvokeMember()

object result = (object)type.InvokeMember("BaseUnit", BindingFlags.GetProperty, null, inst, null);

Console.WriteLine(result);

要应用方法,您将使用BindingFlags.InvokeMethod调用相同的InvokeMember函数,并向最后一个参数添加可选的方法参数,如下所示:

object result = (object)type.InvokeMember("ToString", BindingFlags.InvokeMethod, null, inst, new object[]{ "string" });

密切关注.net core 3.0,它宣传对动态方法调用的本机支持,就像在Python https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#interop-improvements中看到的那样