- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在尝试开发一种使用反射以编程方式在外部项目中运行测试类的方法。这是应该展示我的问题的简化代码块。
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 加载到同一个 Assembly 类中以便控制引用的方法。由于 AppDomains 已从 .NET Core 中删除,这看起来不太可能,尽管我可能弄错了/看错了区域。
如果我正在做的事情看起来不太可能,有谁知道是否可以使用其他方法实现这种功能? IE。罗斯林?
最佳答案
我只是想我会用我设法找到的解决方案来更新这个问题,以防其他人遇到与我相同的问题。不过我要感谢@Emrah Süngü 为我指明了正确的方向。
Emrah 提醒我,我需要导入要加载的 DLL 的依赖项,以便调用存储在其中的类。一种方法是扩展您的 app.config 以导入这些依赖项 - 但是我想在运行时执行此操作(对于我不知道在启动程序之前要运行的项目)所以我需要寻找其他解决方案。
如果您不使用 .NET Core,这相对简单,因为 AppDomains可用于加载所有依赖项并执行您的代码。然而,由于这已经是removed from .NET Core我需要找到另一个兼容的解决方案。
我考虑过运行一个单独的进程(或 Powershell)并更改工作目录的想法,以便该进程在存储其所需的所有依赖项的目录中运行。但是,我找不到一种方法可以让我对运行这些方法的结果使用react。
后来我研究了如何操纵 AssemblyLoadContext类,但是 ( at the time of writing ) 几乎没有关于此类的文档。我确实找到了这个能够显着帮助的答案...... https://stackoverflow.com/a/37896162/6012159
为了让它工作,我确实不得不做一点小改动,而不是每次都创建一个新的 AssemblyLoader(这会导致在尝试调用程序集内的方法时抛出异常),我每次都重用了 AssemblyLoader (这消除了这个问题)。
public class AssemblyLoader : AssemblyLoadContext
{
private string folderPath;
public AssemblyLoader(string folderPath)
{
this.folderPath = folderPath;
}
protected override Assembly Load(AssemblyName assemblyName)
{
var deps = DependencyContext.Default;
var res = deps.CompileLibraries.Where(d => d.Name.Contains(assemblyName.Name)).ToList();
if (res.Count > 0)
{
return Assembly.Load(new AssemblyName(res.First().Name));
}
else
{
var apiApplicationFileInfo = new FileInfo($"{folderPath}{Path.DirectorySeparatorChar}{assemblyName.Name}.dll");
if (File.Exists(apiApplicationFileInfo.FullName))
{
return this.LoadFromAssemblyPath(apiApplicationFileInfo.FullName);
}
}
return Assembly.Load(assemblyName);
}
}
可用于加载这样的程序集:
string directory = @"C:\Path\To\Project\bin\Debug\netcoreapp1.0\publish\";
string pathToDLL = @"C:\Path\To\Project\bin\Debug\netcoreapp1.0\publish\project.dll";
AssemblyLoader al = new AssemblyLoader(directory);
Assembly assembly = al.LoadFromAssemblyPath(pathToDLL);
关于c# - 使用反射从外部程序集实例化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565508/
我需要为打开的 xlsx 文件取消隐藏工作表 TAB,为此,我使用 VBS 文件打开 xlsm 文件并激活宏(位于模块中)。 当我手动运行宏时,它可以工作。 当它通过vbs激活时,它只能看到包含宏的x
我正在使用 Google Cloud Compute Engine 安装气流并使其保持正常运行。安装很好,现在它在主机上运行:0.0.0.0:8080 我有此 VM 实例的外部 IP 地址,但是我无法
我们可以在 GWT 中使用这个 $entry 方法来允许外部 javascript 执行 java 方法。 你可以在他们的文档 https://developers.google.com/web-to
在 Cython 的“Hello World”和 C 数学库中调用函数的示例之后 here ,我真正想做的是将我自己的 C 代码放在一个单独的文件中,并在 Cython 中使用它。关注 this ,我
我一直在试验 JSON Pointers引用和重用 JSON schemas . 按照示例,我能够引用在另一个 JSON 模式中声明的特定属性,一切都按预期进行,但是我还没有找到一种方法来扩展基本 J
我正在使用 X.jar 并添加到我的 AspectJ 项目(在 eclipse 中)。我已经为 X.jar 中的 myMethod() 方法编写了切入点和建议。 但是aspectj 并没有拦截这个方法
我正在 Controller 中创建一个自定义指令,并在 ng-repeat 中调用它,如下所示: HTML: JS: 在测试指令中,我按如下方式调用 loadDat
我正在尝试加载服务器上本地存在的 HTML 页面,位于名为 HTML-FIles 的文件夹中。 我想使用 jquery 加载一个文件并将其内容显示在 div 中。 现在,我可以加载文件,但在 div
我正在尝试根据初始选择从 JSON 文件生成选择菜单。我见过很多不同的方式,人们为此编写了一个函数,但想要一些非常简单的东西。 HTML: Please select Practis
我的目标是从 HTML 文档中获取文本,该文档不会调用 .jsp 文件中的任何函数。 我环顾四周,我以为我已经找到了问题的答案,但它似乎不起作用,其他答案包括使用 jQuery(我既不熟悉也不允许使用
我正在尝试从外部 JSON 文件获取文件内容,但我一直在警报中收到 null。 JS: function getText() { var result = null; var file
我正在加载一个外部 javascript 文件,该文件仅填充有 int 或字符串或 bool 值或数组的变量。类似... varBool=false; var1="var1"; var2="var2:
我的数据存储在外部 Javascript 文件中。 看起来像这样, window.videos = [{ "name": "Sample data", "duration": 154,
我有一个包含 Google ADWords 的 HTML 页面,以及来自外部 URL 的 ajax 调用,我想获取 json 来自 url 的数据。外部API也是我做的。API Controller
我试图看看是否有一种简单的方法可以通过外部 JavaScript 函数访问 Controller 的内部范围(与目标 Controller 完全无关) 我在这里看到了其他几个问题 angular.el
我尝试在运行外部命令时终止脚本,结果出现错误。考虑这个简单的代码: try { where.exe Test-App } catch { Write-Error "Exception
我在 test.js 中定义了一个外部 JS 函数 function InvokeSupport(ID, TimeStamp, Hash) { var sUrl = '' + "?uid="
如果我想将变量从外部 js 文件提取到另一个外部 js 文件。我该怎么做? 例如,如果我有一个名为 example1.js 的文件,其中包含以下代码 var test = 1; 如何获取变量 tes
我正在尝试使用 java 从外部 jar 中读取文件..例如,我有两个 jar 文件。一个是“foo.jar”,另一个是“bar.jar”。 “bar.jar”内部是文件“foo-bar.txt”。如
在我的 Java 应用程序中,我希望从未实际加载的类文件以及也未加载的 jar 文件中读取字节码内容。理想情况下,我需要能够获取任何给定的 jarfile,并找到其中的所有类。因此,考虑以下情况: 我
我是一名优秀的程序员,十分优秀!