我有供应商提供给我的第三方动态链接库。该库是面向对象的。我目前正尝试从.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调用的适当等价物是什么? 此外,为什么通过反思无法获得预期的方法? 看来该软件供应商可能无法访问所有原始源代码,因此我不确定它们会有多大帮助。这个库旨在模拟他们给我们的另一个库,它们对他们的设备进行以太网调用。如果缺少通过反射显示的可用方法是由于实现不佳,我们可能会构建自己的模拟器。
答案 0 :(得分:0)
我最近使用.net core 2及更高版本中的内置COM支持为类似情况实现了.net解决方案。该解决方案是免注册的。您仍然需要弄清楚所获得的数据类型是什么,但是object
和dynamic
类型可以帮助您解决这一问题。
因此,与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中看到的那样