#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);
Удалите ссылку либо из вызывающего объекта, либо из определения интерфейса, и это не приведет к обновлению массива.