2011-06-01 63 views
6

我有一個C++應用程序。這支持用戶的C++插件DLL,它將動態加載這些DLL,然後能夠動態地創建和使用用戶的類型。這些用戶類型派生自主應用程序核心庫中定義的基類型和接口,因此我將用戶對象作爲指向基類的指針,並調用用戶的虛函數來實現它們的魔力。如何從C++ DLL動態加載C#dll

現在我想擴展插件DLL的允許託管DLL(我主要關心C#)。我希望在C#插件DLL中發生所有相同的魔術。

我該如何動態加載這些dll的,一些我認爲我目前使用的win32的LoadLibrary會滿足於一個託管的DLL。我不會在編譯/鏈接時訪問這些庫,它們來自用戶。

我得到加載的庫後,不幸的是我懷疑COM在我未來作爲調用派生函數的方式。可能我可以使用我一直在閱讀的CLI/C++包裝器,但是我在這裏很缺乏經驗,並且非常感謝任何建議或指向相應文章的鏈接。

回答

2

這樣做的另一種方法是創建一個託管C#類的C++/CLI項目,並將其用作C++項目的橋樑。

一些更多的鏈接,這種做法:

最新的鏈接已爲橋樑

+0

我是否還需要在非託管進程中啓動CLR(按照上面Al3891的響應中的鏈接)來加載此Bridge DLL? – AlwaysTraining 2011-06-01 21:34:07

+0

不是。查看我帖子中的第二個鏈接 – 2011-06-01 22:55:06

2

你要做的是基本上在你的過程中啓動一個CLR實例。 看看這篇文章CLR hosting

+1

很好的參考(+1) – Mike 2011-06-01 20:59:36

+0

鏈接現在被打破。 – tMJ 2016-05-12 20:39:46

0

這裏簡單的源代碼是一些幻燈片來描述我的解。

https://docs.google.com/presentation/pub?id=1YoJRGnveh4By7ym4GL19L7OzYOFORZQB6RgJEPVfFb8&start=false&loop=false&delayms=3000

我的解決辦法是有一個Win32 DLL插件,通過鏈接到混合的C++/CLI DLL,其鏈接到純託管的C#代碼正常裝置(的LoadLibrary)加載。我允許使用大量鍋爐板進行調用,以及基於Padu給出的鏈接的雙C++/cli橋接模式。細節相當複雜,但最終API用戶的工作非常簡單,這就是我的目標。受管理的插件對象編寫器只是從一個對象派生而來,並且一切正常。

本質上我做了一個模式,提供「混合模式僞繼承」現在我的c#對象從C++中的基類派生。