C # + COM, изменить массив в параметре - PullRequest
3 голосов
/ 20 сентября 2010

У меня есть COM-объект в C # и приложение Silverlight (повышенные привилегии), которое является клиентом для этого COM-объекта.

COM-объект:

[ComVisible(true)]
public interface IProxy
{
    void Test(int[] integers);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Proxy : IProxy
{
    [ComVisible(true)]
    public void Test(int[] integers)
    {
        integers[0] = 999;
    }    
}

Клиент Silverlight:

dynamic proxy = AutomationFactory.CreateObject("NevermindComProxy.Proxy");

int[] integers = new int[5];
proxy.Test(integers);

Я ожидаю целые числа [0] == 999, но массив не поврежден.

Как заставить COM-объект изменять массив?

UPD Работает для приложений не Silverlight. Сбой для Silverlight. Как исправить для silverlight?

1 Ответ

1 голос
/ 13 октября 2010

Краткий ответ: вам нужно передать массив по ссылке ref (см. Примечание в AutomationFactory чуть выше примера [массивы передаются по значению в C #]). - Проблема в том, что SL будет блокировать с исключением аргумента при вызове proxy.Test(ref integers) (не знаю почему). Обходной путь заключается в том, что SL передаст массив по ссылке, если метод получает объект по ссылке, поэтому это работает ...

[ComVisible(true)]
public interface IProxy
{
    void Test( ref object integers);
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Proxy : IProxy
{
    [ComVisible(true)]
    public void Test(ref object intObj)
    {
        var integers = (int[])intObj;
        integers[0] = 999;
    }
}

И с добавлением кода SL, например:

dynamic proxy = AutomationFactory.CreateObject("NevermindComProxy.Proxy");

var integers = new int[5];
proxy.Test( ref integers);

Удалите ссылку из определения вызывающего или интерфейса, и массив не обновится.

...