2011-06-10 43 views
1

我有这段代码我试图从vbs脚本重写到c#。将vb6重写为c的问题#

VB有一个数组函数。

这样的代码VB线看起来像这样(在现实中,它是一个LDAP调用):

dGrp.Put “ShowInAddressBook”, 阵列( “VAL”, “VAL”)

我认为C#的当量是:

dGrp.GetType().InvokeMember("Put", 
InvokeMemberFlags, 
null, dGrp, new object[] { "ShowInAddressBook", addressBookvalues.Split(',') }); 

但是,这是行不通的。

我也不能多次调用PUT方法,因为它会覆盖以前的值。它期待着所有的价值。

的脚本工作,但C#产生这样的:

未处理的异常: System.Reflection.TargetInvocationException: 异常已被调用的 目标抛出。 ---> System.Runtime.InteropServices。 收到COMException(0x80004005的):未指定 错误(异常来自HRESULT:0X80004005 (E_FAIL))

任何帮助将是不错的,谢谢!

编辑:对不明确提到解决方案需要保持基于COM。因此,使用托管代码替代方案不是一种选择(在这种情况下)。

绑定标志是:

private static BindingFlags setCOMBindings() 
     { 
      return BindingFlags.DeclaredOnly | 
        BindingFlags.Public | 
        BindingFlags.NonPublic | 
        BindingFlags.Instance | 
        BindingFlags.InvokeMethod; 
     } 
+0

如果你正在使用它的LDAP,你为什么不看看System.DirectoryServices命名空间?我假设你正在对AD条目进行更改。 – 2011-06-10 15:53:05

+0

你作为BindingFlags传入了什么? – 2011-06-10 16:12:22

回答

1

我认为这是一个更好的评论,但我没有足够的声誉,所以这里有云:

我对LDAP不熟悉,因此我不知道你正在谈论的对象,但不可能问题在于你编组值的方式?

如果该方法需要一个VARIANT数组,可能地址簿数组值应该是一个对象数组而不是一个字符串数组。

如果有人能以COM的方式得到这个Put方法的签名,也许这很重要。

+0

我试图传入一个对象[],但也没有工作。在这个阶段,我很想看到这个put方法的一些文档。 – 2011-06-10 19:49:03

+0

你的dGrp变量的类型是什么? – Vladimir 2011-06-10 20:56:15

+0

我发现这个[link](http://msdn.microsoft.com/en-us/library/z6cfh6e6(v = vs.71).aspx#cpcondefaultmarshalingforarraysanchor4),它显示了如何在托管代码和非托管代码之间编组数据。如果方法期望有一组变体,则表明您应该使用System.Array(带有指向_Array的指针或者我认为是正确的,如SAFEARRAY(VARIANTS))。 – Vladimir 2011-06-10 21:23:54

1

喜欢的东西

using System.DirectoryServices; 
... 


    DirectoryEntry entry = new DirectoryEntry("LDAP://<your_dn_here>"); 
    object[] entries = addressBookValues.Split(','); 
    entry.Properties["ShowInAddressBook"].AddRange(entries); 

    try 
    { 
    entry.CommitChanges(); 
    Console.WriteLine("Success!!"); 
    } 
    catch(Exception e) 
    { 
    Console.WriteLine(e); 
    } 
+0

感谢您的这一点,但我需要使用COM方法来做到这一点。在这种情况下 - 理由=长话。 – 2011-06-10 18:24:32

+0

@JL - 你能够使.Net程序集COM可见,然后使用它?我很多时候都在Visual Fox Pro中工作,并且已经用C#编写了COM东西,因为它更简单,并且当应用程序最终升级时,COM组件已经被迁移。 – 2011-06-10 21:09:49