C # COM, изменить массив в параметре

#c# #com #interop #com-interop

#c# #com #взаимодействие #com-взаимодействие

Вопрос:

У меня есть 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. Почему вы используете COM в качестве механизма взаимодействия между двумя сборками .NET? Возможно, вам следует использовать сборку. Загрузить вместо этого?

2. Цель состоит в том, чтобы использовать машинный код из приложения silverlight. Итак, я делаю silverlight -> COMProxy -> машинный код. Насколько я понимаю, silverlight не может вывести машинный код из своей изолированной среды. Пожалуйста, поправьте меня, если я ошибаюсь.

3. это за пределами моих знаний, извините. Удачи в поиске ответа!

Ответ №1:

Короткий ответ заключается в том, что вам нужно передать массив по ссылке (см. Примечание в 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);
  

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