2013-06-05 29 views
2

我有一個具有附加功能的C#應用​​程序。實現特定接口的插件/插件可以在運行時鏈接/加載到主C#應用程序。在非託管cpp中實現C#接口dll

現在我的問題:我如何開發一個非託管cpp dll,實現C#接口並將運行時加載到C#應用程序中?

感謝, Cabbi

回答

1

你可以使用P/inkove,例如實現接口:

public interface IDirectory 
{ 
    bool IsDirectoryEmplty(string path); 
} 

public class Directory : IDirectory 
{ 
    [DllImport("Shlwapi.dll", EntryPoint = "PathIsDirectoryEmpty")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool IsDirectoryEmplty([MarshalAs(UnmanagedType.LPStr)]string directory); 

    bool IInterface.IsDirectoryEmplty(string path) 
    { 
     return IsDirectoryEmplty(path); 
    } 
} 
+0

與僅調用C#方法相比,您對性能有任何概念嗎?有很多開銷嗎? – SamiHuutoniemi

+0

我想,這樣的實現(exteranal c/C++)只能用於大型計算 –

+0

簡單而有效的例子,謝謝德米特里! – cabbi

0

隨着上,你可以寫全本地C++的能力在混合託管的DLL。

而且你可以通過淨負荷的PInvoke非託管的DLL,但我寧願不建議這樣。

+0

你爲什麼不推薦 '的PInvoke'? – cabbi

+0

@Cabbi C++/CLI比PInvoke更容易編寫。即使大部分時間只是一點點,C++/CLI都比PInvoke快。 – BlueWanderer

0

嚴格地說,你不能有一個非託管實現C#(託管)接口的DLL。

但是,您可以創建一個mixed mode assembly,這可能是您想要的。這是一種非常普遍的方式,它提供了一個.NET包裝器的本地C++(非託管)實現,使其成爲一個可以管理C#(或其他.NET語言)使用者的程序集。

此外,您可以使用PInvoke從NET程序集中使用純原生DLL。

+0

...我不知道混合模式,很好! – cabbi

+0

我會調查'PInvoke'開銷。 – cabbi