我有下面的代碼的調試信息在調試模式下時,添加到一條消息:運行期間何時發生方法解析/查找?
代碼在測試DLL
private string GetMessage(Foo foo)
{
var messageBuilder = new StringBuilder();
// add message info
#if DEBUG
messageBuilder.AppendLine(foo.GetDebuggingInfo());
#endif
return messageBuilder.ToString();
}
圖書館在測試
C++庫從C#叫通過託管C++包裝項目
#ifdef DEBUG
string Foo::GetDebuggingInfo()
{
...
}
#endif
現在我跑進是Foo
在單獨的庫中聲明的問題,GetDebuggingInfo
也有條件地編譯。而爲了向後兼容測試儀DLL是對圖書館的所有以前發佈的版本上運行的測試,以確保輸出我們的服務器發送將繼續按預期在所有不同版本的客戶端中被攝取。測試代碼然後被複制到一個文件夾,以及要測試的庫的期望版本,而不是測試人員編譯的版本。一切都運行良好,直到我的代碼達到GetMessage
,那就是當我遇到MethodNotFoundException
。
我的第一個解決這個嘗試,我想使用反射,以確保該函數存在的調用函數之前,像這樣:
#if DEBUG
if (foo.GetType().GetMethod("GetDebuggingInfo", BindingFlags.Instance | BindingFlags.Public) != null)
messageBuilder.AppendLine(foo.GetDebuggingInfo());
#endif
我估計會保持該方法被調用,即使測試器DLL是一個調試版本,測試下的DLL是一個發佈版本。仍是同樣的問題。添加了一些額外的跟蹤調試語句後,我發現GetMessage
甚至沒有被輸入。在意識到這一點後,我嘗試將有問題的方法調用移入它自己的函數中,並且一切正常。
#if DEBUG
// reflection check remains to keep the call from blowing
// up when Tester is DEBUG and Under Test is RELEASE
if (foo.GetType().GetMethod("GetDebuggingInfo", BindingFlags.Instance | BindingFlags.Public) != null)
AddDebuggingInfo(messageBuilder, foo);
#endif
#if DEBUG
private void AddDebuggingInfo(StringBuilder messageBuilder, Foo foo) =>
messageBuilder.AppendLine(foo.GetDebuggingInfo());
#endif
所以,即使我有我需要一個有效的解決方案,我不明白我的最終解決方案是如何工作的,當我想通了反映檢查就已經足夠了,從扔MethodNotFoundException
保持代碼。所以在運行時,何時查找和解決了方法?
看到我更新的答案我添加了其他2個選項,你可以作爲變通 –