2012-10-17 39 views
4

我想從我的程序中使用C#打開CorelDRAW。到目前爲止,我已經能夠做到這一點通過引用相應的COM庫,並呼籲創建一個COM互操作類的實例

CorelDRAW.Application draw = new CorelDRAW.Application(); 
draw.Visible = true; 

不過,我想我的程序與支持互操作的CorelDRAW任何版本的工作。我正在嘗試在運行時使用反射來加載互操作庫,其中可以爲正確的版本選擇特定的dll。從環顧四周我嘗試了以下。

string path = "Interop.CorelDRAW.dll"; 
Assembly u = Assembly.LoadFile(path); 
Type testType = u.GetType("CorelDRAW.Application"); 

if (testType != null) 
{ 
    object draw = u.CreateInstance("CorelDRAW.Application"); 

    FieldInfo fi = testType.GetField("Visible"); 
    fi.SetValue(draw, true); 
} 

該程序失敗在u.CreateInstance...失敗,因爲CorelDRAW.Application是一個接口,不是類。我也嘗試將CorelDRAW.Application替換爲CorelDRAW.ApplicationClass,因爲當我通過Interop.CorelDRAW作爲資源瀏覽時可用,但是u.getType...失敗。

我該如何得到這個工作?謝謝!

+0

我已經得到這方面的工作在一定程度上。我在C#解決方案中創建了5個額外的項目,每個項目都包含對特定版本Corel的引用。然後該項目有一個函數返回我的CorelDRAW.Application對象。然後我可以在主程序中使用該對象的反射。不是最乾淨的,但到目前爲止,這已經足夠了。 –

回答

4

您可以使用下面的結構在註冊ActiveX對象的實例:

Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true); 
object vc = Activator.CreateInstance(type); 

然後你有3種選擇,如何與返回的對象工作。

  1. 鑄造返回的對象,以實際CorelDRAW.Application接口,但對於這一點,你需要引用一些CorelDraw的庫,包含它,而且很可能這將產生版本問題。

  2. 反射,你在你的問題中提到。

  3. 使用動態關鍵字,所以你可以調用現有的方法和屬性,就像它是一個真正的CorelDraw類/接口。

    Type type = Type.GetTypeFromProgID("CorelDRAW.Application", true); 
    dynamic vc = (dynamic)Activator.CreateInstance(type); 
    vc.Visible = true; 
    
1
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fullPath); 
    dynamic app = assembly.CreateInstance("CorelDRAW.ApplicationClass", true); 

這是要去工作