2015-01-27 55 views
0

有限定一個導入的COM接口的第三方的.Net組件,從另一個COM對象獲取一個對象,並將其投射到導入的接口:如何將管理對象強制轉換爲COM接口?

[ComImport, Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
private interface IMyInterface 
{ 
    //... 
} 

void SomeMethod(object obj) 
{ 
    IMyInterface iface = obj as IMyInterface ; 
    if (iface == null) 
     throw("Cannot get IMyInterface"); 
} 

的方法是公共的,而導入的COM接口是內部的。我如何創建自己的實現該COM接口的託管對象?重新導入相同的接口在我的組裝顯而易見的解決方案不起作用:

[ComImport, Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
private interface IMyInterface 
{ 
    //... 
} 

class MyClass : IMyInterface 
{ 
} 

SomeMethod(new MyClass()); 

儘管具有相同的GUID和被標記爲一個COM接口,.NET運行時會將進口接口,2個不同的接口和不會將我的對象轉換爲另一個程序集中聲明的接口。

我不能從第一個程序集中引用導入的接口,因爲它沒有被聲明爲公共的。我是否可以通過某種方式指示.Net運行時爲我的託管對象創建一個RCW並隱藏實際的對象或者重寫默認的投射行爲?

我知道動態聯編程序,但代碼需要在.Net 2.0+上運行,所以很遺憾不是一個選項。

+0

我回答了類似的問題[這裏](http://stackoverflow.com/a/26796534/1768303)。我相信該解決方案應該適用於.NET 2.0+。 – Noseratio 2015-01-27 05:31:23

回答

0

如果你使用.NET 2.0,最好的辦法是使用反射從另一個程序集中獲取類型,然後使用Marshal.CreateWrapperOfType()。

例如,你可以這樣調用它:

var t1 = Type.GetType(assemblyQualifiedName); 
object properlyTypedObj = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(myobj, t1); 
+1

這不起作用,因爲這兩個接口都是管理的接口。一種可行的方法是[this](http://stackoverflow.com/a/26796534/1768303)。 – Noseratio 2015-01-27 05:34:02

+0

我假設原始對象是一個實際的原生COM對象,而不是.NET對象。我也錯過了他創建自己的託管類來實現界面的部分。如果它是真正的本地COM,則更簡單的解決方案就是重新導入COM類型庫並通過該對象創建COM對象(如果可能的話)。 – 2015-01-27 13:11:34

相關問題