我有一個具有附加功能的C#應用程序。實現特定接口的插件/插件可以在運行時鏈接/加載到主C#應用程序。在非託管cpp中實現C#接口dll
現在我的問題:我如何開發一個非託管cpp dll,實現C#接口並將運行時加載到C#應用程序中?
感謝, Cabbi
我有一個具有附加功能的C#應用程序。實現特定接口的插件/插件可以在運行時鏈接/加載到主C#應用程序。在非託管cpp中實現C#接口dll
現在我的問題:我如何開發一個非託管cpp dll,實現C#接口並將運行時加載到C#應用程序中?
感謝, Cabbi
你可以使用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);
}
}
隨着上,你可以寫全本地C++的能力在混合託管的DLL。
而且你可以通過淨負荷的PInvoke非託管的DLL,但我寧願不建議這樣。
你爲什麼不推薦 '的PInvoke'? – cabbi
@Cabbi C++/CLI比PInvoke更容易編寫。即使大部分時間只是一點點,C++/CLI都比PInvoke快。 – BlueWanderer
嚴格地說,你不能有一個非託管實現C#(託管)接口的DLL。
但是,您可以創建一個mixed mode assembly,這可能是您想要的。這是一種非常普遍的方式,它提供了一個.NET包裝器的本地C++(非託管)實現,使其成爲一個可以管理C#(或其他.NET語言)使用者的程序集。
此外,您可以使用PInvoke從NET程序集中使用純原生DLL。
與僅調用C#方法相比,您對性能有任何概念嗎?有很多開銷嗎? – SamiHuutoniemi
我想,這樣的實現(exteranal c/C++)只能用於大型計算 –
簡單而有效的例子,謝謝德米特里! – cabbi