2012-01-25 76 views
0

我宣佈一個接口上像這樣的方法:可以從Managed C++調用.NET變量長度參數方法嗎?

public interface IInterface 
{ 
    void DoSomething(string format, params object[] arguments); 
} 

我動態加載使用此接口的實現有管理的C++類。接口和實現都是C#。

IInterface^ foo = gcnew Implentation(); 

此電話爲罰款:

foo->DoSomething("string", someParam); 

此調用失敗:

foo->DoSomething("string"); 

它看起來像如果沒有參數傳遞,它只是不能解析方法,它應接受任何參數的數量(當然包括零)。我大概可以使用nullptr作爲佔位符,但這非常難看,或者我可以添加一個多餘的超載DoSomething(string format),這不但不是很好,而且比讓所有調用比應該更笨拙都更好。

我錯過了什麼,或者這不被支持?互聯網上的所有助手都展示瞭如何在C++中聲明相當於params的參數,但這對我的場景沒有幫助。

+0

要明確一點,C++類是實現接口還是使用實現它的類?文本說它使用另一個類,但'IInterface foo = new Implementation();'是C#代碼。 – porges

+0

我已經更新了這個問題,以便更清楚。 C++類擁有一個C#類(實現C#接口)的實例。 – JRoughan

+0

呃,對不起。是的,當然應該是 – JRoughan

回答

0

我無法複製您的問題。

鑑於C#接口&實現:

using System; 

namespace SomeNamespace 
{ 
    public interface IInterface 
    { 
     void Print(string format, params object[] args); 
    } 

    public class Implementation : IInterface 
    { 
     public void Print(string format, params object[] args) 
     { 
      Console.WriteLine(format, args); 
     } 
    } 
} 

這個C++/CLI代碼工作正常:

using namespace System; 
using namespace SomeNamespace; 

public ref class Test 
{ 
public: 
    static void Run() 
    { 
     IInterface^ foo = gcnew Implementation(); 
     foo->Print("hello, {0}", "world"); 
     foo->Print("hello, world"); 
    } 
}; 

有沒有在這裏缺少另一個元素?或者我錯過了這一點:)

+0

不,我相信你已經得到了:)這正是我期望的行爲,但是當我嘗試我的建議(nullptr或重載)時,一切正常。我沒有提到的唯一的事情是,C++類是通過反射動態加載的,但這在其他情況下沒有問題。從我接觸C++開始已經很長時間了,所以在託管的世界中,我更有可能錯過某些東西(編譯器選項或其他)。 – JRoughan

相關問題