2010-09-20 59 views
3

中的數組我有一個C#中的COM對象和一個Silverlight應用程序(升級權限),它是這個COM對象的客戶端。C#+ 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); 

我excpect整數[0] == 999,但該陣列是完整的。

如何使COM對象修改數組?

UPD 適用於非silverlight應用程序。 Silverlight失敗。如何解決silverlight?

+0

爲什麼使用COM作爲2個.NET程序集之間的互操作性引擎?也許你應該使用Assembly.Load來代替? – AlexanderMP 2010-09-20 11:23:00

+0

目標是使用silverlight應用程序的本地代碼。所以我做silverlight - > COMProxy - >本地代碼。據我瞭解,silverlight不能從沙箱中挑出原生代碼。請糾正我,如果我錯了。 – 2010-09-20 11:34:50

+0

這是超出我的知識,對不起。祝你好運找到答案! – AlexanderMP 2010-09-21 08:44:48

回答

1

簡短的回答是你需要通過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); 

從調用者或接口定義中刪除ref,它不會更新數組。