然而,如果我尝试从NUnit运行单元测试,我会得到以下异常:
ClassLibrary1.Tests.UnitTests.TestPerformOptimization: System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation. ----> System.Exception : Error marshalling .NET object. 'Message: Unable to find assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Source: mscorlib HelpLink:
如果我尝试从独立的NUnit控制台、ReSharper的测试运行器或者尝试从Excel中调用该函数(使用Excel-DNA),我会得到相同的错误。
在调用我的编译Matlab组件时,我实际上将一个C#方法(在MWObjectArray对象中)打包起来并注入进去。我认为问题是发生在编译的Matlab组件尝试调用这个注入的方法时。
我找到的唯一解决方法是将包含被注入方法的类的副本放在NUnit测试运行器,ReSharper测试运行器或Excel的相同位置。然而,这并不是一个实际的解决方案,因为我需要将此应用程序安装到用户的机器上。另一个选项是将文件复制到我的%DEVPATH%,但由于同样的原因,我无法使用它。
有没有办法告诉Matlab组件在哪里找到我注入方法/类的程序集? 示例项目下载 可以在这里下载示例项目。只需按照zip文件中的README.txt文件中的说明操作即可。 更新1 通过修改我的类以在其构造函数中包含以下内容,我成功使我的单元测试识别我的程序集:
AppDomain.CurrentDomain.AssemblyResolve +=
(sender, args) => typeof(OptimizationFunction).Assembly;
然而,现在我遇到以下异常:
异常:System.Reflection.TargetInvocationException:已通过调用目标引发异常。 ---> System.Exception:错误编排 .NET 对象。'消息:无法加载文件或程序集“dotnetcli,Version=1.0.5488.33915,Culture=neutral,PublicKeyToken=da1231a838c93da4”或其其中之一的依赖项。需要具有强名称的程序集。(HRESULT 异常:0x80131044)源:mscorlib HelpLink:'在 dotnetcli.throwNetExceptionID(BaseMsgID* msgId) 位置 在 dotnetcli.DeployedDataConversion.GetMxArrayFromObject(Object data) 位置--- 内部异常堆栈跟踪的结尾--- 位置于 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
因此,它现在无法解决dotnetclli.dll(请参见下面的Fusion日志/异常),据我所知,它应该只驻留在C:\Program Files (x86)\MATLAB\MATLAB Runtime\v85\bin\win32。
以下是 Fusion 日志的摘录:
=== 预绑定状态信息 ===
LOG: DisplayName = ClassLibrary1 (部分) WRN: 程序集名称:ClassLibrary1 | 域 ID:1 WRN: 当只提供程序集显示名称的一部分时,会发生部分绑定。 WRN: 这可能导致绑定器加载错误的程序集。 WRN: 建议为程序集提供完全指定的文本标识, WRN: 该标识由简单名称、版本、区域性和公钥令牌组成。 > WRN: 有关此问题的更多信息和常见解决方案,请参见白皮书http://go.microsoft.com/fwlink/?LinkId=109270。 LOG: Appbase = file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ LOG: 初始 PrivatePath = NULL LOG: 动态 Base = NULL LOG: 缓存 Base = NULL LOG: AppName = nunit-agent-x86.exe 调用程序集:(未知)。
=== LOG: 此绑定在默认加载上下文中开始。 LOG: 使用应用程序配置文件: C:\Insight\TFS\Asg\ConsoleApplication4\packages\NUnit.Runners.2.6.3\tools\nunit-agent-x86.exe.Config LOG: 使用主机配置文件: LOG: 使用来自 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 的计算机配置文件。 LOG: 目前未将策略应用于此引用(私有、自定义、部分或基于位置的程序集绑定)。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication4/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1/ClassLibrary1.DLL。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1.EXE。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1/ClassLibrary1.EXE。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1.EXE。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1/ClassLibrary1.EXE。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1.EXE。 LOG: 尝试下载新 URL file:///C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1/ClassLibrary1.EXE。 LOG: 所有探测的 URL 均已尝试并失败。
警告:为程序集提供了部分绑定信息:我的控制台应用程序可以解析此程序集,但我的NUnit测试不能解析它?
更新2
我联系Matlab时收到了以下回复:
据我所知,这是默认的.NET反序列化行为。反序列化类的应用程序会在其自己的当前文件夹和GAC中查找程序集,如果找不到,则类似于以下情况(当您阅读此内容时,请将MATLAB替换为Nunit)。您的示例并未涉及MATLAB的情况。MATLAB将类发送到APPDomains。您的示例没有这样做。
使用Fuslogvw查看绑定。您将看到无法解析依赖项的调用应用程序而不是MATLAB(在您的情况下是nunit-agent-x86.exe)。
Setting
项)。 - Andrey Bushman