2013-06-27 59 views
0

說明。有一個C++ exe和一個C#exe。 C#exe是一個C#dll的包裝器。我需要dll在C++代碼中調用記錄器函數(以便只生成一個日誌文件)。目前有一個C++/CLI橋接器,它允許C++ exe在C#dll中調用方法。從C#dll調用C++應用程序的方法

道歉,如果這是一個糟糕的問題。它可能是一個我只是不知道要搜索什麼/我搜索的結果是沒有太大用處的情況。

我有一個用C++編寫的應用程序。它調用了用C#編寫的工具。看來該工具的可執行文件只是c#dll的包裝器。 工具的目的是分析和顯示數據。主應用程序調用它來打開一個新文件。該工具從來不需要在C++代碼中調用任何東西,因此這一直是單向的。它似乎是通過C++/CLI橋實現的。橋接器調用工具API中的函數。

該工具現在需要在C++應用程序中調用某些方法。我不知道如何去實現這一點。我的c#/ C++/CLI經驗介於窮人和不存在之間。我開始試圖克隆C++/CLI橋並將其「反向」,但是由於C#代碼實際上是一個庫,所以從橋上調用它非常簡單。 但是,我不確定(如果它甚至可能)如何從橋上調用C++應用程序。

到目前爲止,我能想到的唯一可行的解​​決方案是將c#代碼輸出到文件(或希望共享內存),然後C++代碼會定期檢查它。這並不理想。

任何意見,將不勝感激。

謝謝

+1

這顯然是一個重複的問題。你有沒有試過這個:http://bit.ly/1ah8rhc? –

+1

我正在嘗試做相反的事情。我需要C#dll從C++調用方法。我發現的一切似乎都與C++庫有關。我可能會朦朧,但我覺得比你想象的要稍微少一些。 – Hector

+1

有趣的是,我發現這些問題每個月都會過去,但很難找到它們。無論如何,答案永遠是saem:使用P/Invoke(困難的方式),或者在兩者之間寫一個CLI層(就我而言,這種方式) – stijn

回答

1

好吧,我想我會在這裏提出一個建議。

根據你的目標是什麼:

1)目標:從C#代碼執行一些你的C++邏輯。

解決方案:這個很簡單。您將感興趣的邏輯抽取到單獨的C++項目中,將其構建爲庫,然後在兩個應用程序中使用它。正如你所說,有很多關於如何從c#代碼調用C++ dll的例子。

2)目標:讓您的C++應用程序從C#應用程序執行一些邏輯。

解決方案:這一切都涉及到建立一個進程間通信。有很多方法,列出了here。我建議使用NamedPipes,但你可以自由選擇你喜歡的W/E。

編輯:通過您的編輯判斷,您可能需要第二個解決方案。

+0

我認爲你是對的,現在最簡單的解決方案似乎只是具有所有記錄器代碼的dll,並從兩者中調用它。 現在似乎很簡單!其中一個砰地撞上牆壁的瞬間... – Hector

+0

@ user2036256第一種方法tho要小心。如果您爲這兩個應用程序使用單個dll,則仍然會有_two_ logger的實例(每個應用程序一個)。如果這些記錄器將嘗試同時鎖定相同的文本文件(例如寫入),這將導致異常。 –

+0

*不應該*能夠發生。該代碼只記錄用戶操作,所以除非用戶可以在窗口之間移動,並且發出的命令比讀取/寫入更快,否則它應該沒問題。 但我會添加一些基本的異常處理以保證安全。謝謝 – Hector