Проблема перезаписи vb6 в c # - PullRequest
1 голос
/ 10 июня 2011

У меня есть этот код, который я пытаюсь переписать в c # из скрипта VBS.

VB имеет функцию массива.

Таким образом, строка кода VB выглядит следующим образом (На самом деле это вызов LDAP):

dGrp.Put "ShowInAddressBook", Array ("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;
        }

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Я думаю, что это было лучше в качестве комментария, но у меня недостаточно репутации, так что вот так:

Я не знаком с LDAP, поэтому я не знаю объектов, о которых вы говорите, но вряд ли возможно, что проблема в том, как вы маршалируете массив значений?

Если метод ожидает массив VARIANT, возможно, массив значений адресной книги должен быть массивом объектов вместо массива строк.

Может быть, было бы важно, если бы кто-то мог получить подпись этого метода Put в виде COM.

1 голос
/ 10 июня 2011

Что-то вроде

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);
     } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...