我目前正在嘗試開發一種使用反射以編程方式在外部項目中運行測試類的方法。這是一個簡化的應該展示我的問題的代碼塊。(C#.Net Core)使用反射來從外部程序集實例化一個類
string pathToDLL = @"C:\Path\To\Test\Project\UnitTests.dll";
IEnumerable<Type> testClasses = assembly.GetExportedTypes();
Type testClass = testClasses.First();
object testClassInstance = assembly.CreateInstance(testClass.FullName);
此代碼引發以下異常:
'assembly.CreateInstance(testClass.FullName)' threw an exception of type 'System.Reflection.TargetInvocationException'
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146232828
HelpLink: null
InnerException: {System.IO.FileNotFoundException: Could not load file or assembly 'Project.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
File name: 'Project.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
at Project.UnitTests.TestClass..ctor()}
Message: "Exception has been thrown by the target of an invocation."
Source: "System.Private.CoreLib"
StackTrace: " at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)\r\n at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)\r\n at System.Activator.CreateInstance(Type type, Boolean nonPublic)\r\n at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)\r\n at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)\r\n at System.Reflection.Assembly.CreateInstance(String typeName, Boolean ignoreCase, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)\r\n at System.Reflection.Assembly.CreateInstance(String typeName)"
在堆棧跟蹤它指出它「無法加載文件或程序集Project.Core ......'」。
該項目是目標DLL直接引用的一個項目(它測試的項目)。有誰知道爲什麼這將無法自動拾取這些DLL?
我調查研究解決這個問題的辦法:
1)這可能是因爲這些DLL已編譯的方式 - 這是目前 - 這可以爲我在這個控制改變通過在解決方案級別運行dotnet build */*/project.json
。這成功編譯了所有內容,並且所有相關的DLL似乎都被填充到了bin文件夾中。我還調查了是否改爲dotnet publish
或dotnet build */*/project.json --configuration Release
,儘管這兩者似乎都沒有幫助。
2)我也研究過使用不同的編譯方法,如Activator.CreateInstance
再次沒有骰子。
3)我似乎沒有看到一種方法將多個DLL加載到相同的Assembly類,以便我可以控制引用。由於AppDomain已經從.Net Core中刪除,這看起來並不可能,儘管我可能弄錯了/看錯了地方。
如果我這樣做似乎並不喜歡將有可能是什麼,沒有人知道是否可以使用不同的方法來實現這種功能?即羅斯林?
絕對是一個很好的參考!我還沒有運行代碼,但它真的遞歸加載所有必需的引用? –
它確實 - 只要他們是在目錄中但不知道子目錄(我還沒有面對尚) –