使用反射EWS API C#

时间:2019-01-08 19:38:07

标签: c# api dll reflection exchangewebservices

我正在尝试在SSIS脚本任务中使用EWS API,但是服务器没有相应的dll:Microsoft.Exchange.WebServices.dll

所以,反射是我找到的唯一解决方案,它是服务器中的dll文件,我可以使用。

我需要实例化抽象类的子类,但是编译器给出此消息错误:找不到Microsoft.Exchange.WebServices.Data.SearchFilter + IsEqualTo的构造函数

我试图使用Microsoft.Exchange.WebServices.Data.SearchFilter + IsEqualTo,Microsoft.Exchange.WebServices.Data.SearchFilter.IsEqualTo并获取SearchFilter的嵌套类型,但没有效果

   Type typeSearchFilter = DLL2.GetType("Microsoft.Exchange.WebServices.Data.SearchFilter");


    var typeSearchFilterIsEqualTo = typeSearchFilter.GetNestedType("IsEqualTo");

    Type typeSearchFilterIsEqualTo0 = DLL2.GetType("Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo");

    Type typeSearchFilterIsEqualTo1 = DLL2.GetType("Microsoft.Exchange.WebServices.Data.SearchFilter.IsEqualTo");

    dynamic searcherFilter = Activator.CreateInstance(typeSearchFilterIsEqualTo, new object[] { folderSchemaDisplayName, folder})

我希望创建一个SearchFilter.IsEqualTo的新实例,并将参数传递给构造函数,然后将结果保存在变量中,就像这样

          dynamic searcherFilter = Activator.CreateInstance(typeSearchFilterIsEqualTo, new object[] { folderSchemaDisplayName, folder});

            var filter = searcherFilter;

1 个答案:

答案 0 :(得分:0)

我认为您的“ typeSearchFilterIsEqualTo”参数必须是对Microsoft.Exchange.WebServices.Data.FolderSchema.DisplayName的引用,它是DLL中的一个公共静态字段。

这是一个完整的例子:

var DLL = Assembly.LoadFile(@"C:\Microsoft.Exchange.WebServices.dll");

var isEqualsTo = DLL.GetType("Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo");

var param1 = DLL.GetType("Microsoft.Exchange.WebServices.Data.FolderSchema").GetField("DisplayName").GetValue(null);
var param2 = "C:\\";

var instance1 = Activator.CreateInstance(isEqualsTo, new[] { param1, param2 });

// or...

var typeParam1 = DLL.GetType("Microsoft.Exchange.WebServices.Data.PropertyDefinitionBase");
var typeParam2 = typeof(object);

var ctor = isEqualsTo.GetConstructor(new[] { typeParam1, typeParam2 });

var instance2 = ctor.Invoke(new[] { param1, param2 });