【发布时间】:2017-03-26 17:14:59
【问题描述】:
我目前正在尝试开发一种使用反射以编程方式在外部项目中运行测试类的方法。这是一段简化的代码,应该可以展示我的问题。
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?
我已经研究了解决这个问题的方法:
-
这可能是 dll 的编译方式 - 这可以在我控制时更改 - 目前通过在解决方案级别运行
dotnet build */*/project.json。这成功编译了所有内容,并且所有相关的 DLL 似乎都填充在 bin 文件夹中。我还调查了是否更改为dotnet publish或dotnet build */*/project.json --configuration Release尽管似乎都没有帮助。 -
我还研究过使用不同的编译方法,比如
Activator.CreateInstance再次没有骰子。 -
我似乎没有看到将多个 DLL 加载到同一个程序集类中以便我可以控制引用的方法。由于 AppDomains 已从 .NET Core 中删除,这看起来不太可能,尽管我可能弄错了/看错了区域。
如果我正在做的事情看起来不可能,有谁知道这种功能是否可以使用不同的方法来实现? IE。罗斯林?
【问题讨论】:
标签: c# .net-core reflection initialization