2012-04-04 59 views
0

我對.NET中的Com Plus Interop服務瞭解不多 - 我讓.NET完成所有骯髒的工作,並且跨越我的手指,它將起作用。那麼,現在我卡住了。在.NET interop中傳遞vb6對象類型參數byref會導致類型不匹配

我有一個在VS 2010 C#程序中使用VB6編譯COM DLL的引用。這是我創建的發票。

我實例化一個對象:

UIInvoice Invoice = new CUIInvoice(); 

然後我設置一些發票頭部屬性:

Invoice.set_InvoiceType("VO"); 
Invoice.set_InvoiceTypeID(2); 

而現在,我想創造一些發票明細行,我通過調用做添加發票子對象的方法:

Invoice.InvoiceDetails.Add("StringParam1", "StringParam2", Invoice); 

函數的第三個參數呼叫被定義在我的VB6添加功能:

ByRef Parent As Object 

當我運行我的.NET程序,我得到一個「類型不匹配」的錯誤時,我打的添加行。

任何人都可以以簡單的方式提出一種方法,我可以得到這個工作嗎?

+0

您通常會在C#中寫入'ref Invoice'。猜猜你在使用C#版本4.沒有其他顯而易見的事情,它只是不喜歡CUIInvoice作爲父項。也許是因爲「UI」。 – 2012-04-04 20:29:10

+0

嗨漢斯,謝謝你的回覆。當我通過ref傳遞Invoice對象時,實際上有一個編譯器錯誤 - 這可能是對知識更豐富的人的線索:無法從'ref UIInvoice.CUIInvoice'轉換爲'ref object'。如果我在對象temp = Invoice中聲明靜態對象類型;並通過ref傳遞temp,我得到相同的類型不匹配錯誤。 – user529703 2012-04-05 11:10:24

+0

UIInvoice和CUIInvoice有什麼區別?如果您將發票聲明爲:CUIInvoice Invoice = new CUIInvoice();? – 2012-04-05 13:23:06

回答

0

我的建議是不要與COM混淆,但將VB6代碼遷移到Visual Basic.NET。用C#來回編組對象的問題會少得多。如果此對象與其他舊版應用程序共享,則可以創建一個保持舊版兼容性的COM包裝器。顯然你需要權衡這與你的業務需求。

+0

mgnoonan,謝謝你的評論。我相信你是對的。我希望將代碼遷移的想法縮短 - 這太大了。這可能是啓動過程的一個很好的理由。 – user529703 2012-04-05 15:55:55

+0

這通常是如何開始的,但最終你會遇到更多的問題和繃帶解決方案,而不是如果你只是深入挖掘並進行移植。從長遠來看,你會變得更好。 – mgnoonan 2012-04-05 16:53:49

0

如果您擁有VB6源碼,那麼我建議將Add的定義更改爲ByVal而不是ByRef。幾乎從來沒有理由在VB6中使用ByRef對象引用,並且從我的代碼中收集的小小一點,您不需要在域對象中關聯paranet/child關係。

相關問題