ope*_*hac 22 .net c# matlab nunit
我有一个C#类,它调用从Matlab函数构建的.Net程序集.我可以从一个简单的C#控制台应用程序调用此函数,没有任何问题.
但是,如果我尝试从NUnit运行单元测试,我会得到以下异常:
ClassLibrary1.Tests.UnitTests.TestPerformOptimization:System.Reflection.TargetInvocationException:调用目标抛出了异常.----> System.Exception:编组.NET对象时出错.'消息:无法找到程序集'ClassLibrary1,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'.来源: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;
Run Code Online (Sandbox Code Playgroud)
但是现在我得到以下异常:
异常:System.Reflection.TargetInvocationException:调用目标抛出了异常.---> System.Exception:编组.NET对象时出错.'消息:无法加载文件或程序集'dotnetcli,Version = 1.0.5488.33915,Culture = neutral,PublicKeyToken = da1231a838c93da4'或其依赖项之一.需要一个强名称的程序集.(来自HRESULT的异常:0x80131044)来源:mscorlib HelpLink:'at dotnetcli.throwNetExceptionID(BaseMsgID*msgId)at 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日志的摘录:
===预绑定状态信息===
日志:DisplayName = ClassLibrary1(部分)WRN:程序集名称:ClassLibrary1 | 域ID:1 WRN:仅提供部分程序集显示名称时发生部分绑定.警告:这可能导致装订器装入错误的装配.警告:建议为程序集提供完全指定的文本标识,即WRN:由简单名称,版本,区域性和公钥标记组成.> WRN:有关此问题的更多信息和常见解决方案,请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270.日志:Appbase = file:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/日志:初始PrivatePath = NULL日志:动态Base = NULL日志:缓存基数=空日志:AppName = nunit-agent-x86.exe调用程序集:(未知).
===日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:C:\ Insight\TFS\Asg\ConsoleApplication4\packages\NUnit.Runners.2.6.3\tools \nunit-agent-x86.exe.Config日志:使用主机配置文件:日志:使用机器来自C:\ Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config的配置文件.日志:此时策略未应用于引用(私有,自定义,部分或基于位置的程序集绑定).日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication4/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1/ClassLibrary1.DLL.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1.EXE.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/ClassLibrary1/ClassLibrary1.EXE.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1.EXE.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/lib/ClassLibrary1/ClassLibrary1.EXE.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1.EXE.日志:尝试下载新的URL文件:/// C:/XXXXX/ConsoleApplication1/packages/NUnit.Runners.2.6.3/tools/addins/ClassLibrary1/ClassLibrary1.EXE.日志:所有探测URL都已尝试失败.
警告:为程序集提供了部分绑定信息:为什么我的控制台应用程序可以通过我的NUnit测试来解析此程序集?
更新2
当我联系他们时,我得到了Matlab的以下回复:
据我所知,这是反序列化时的默认.NET行为.反序列化该类的应用程序在其自己的当前文件夹和GAC中查找程序集,在该文件夹中找不到它.它类似于(当你读到这个替换MATLAB与Nunit)
您的示例并不代表涉及MATLAB时的情况.MATLAB通过APPDomains发送类.你的例子没有那样做.
使用Fuslogvw查看绑定.您将看到它不是MATLAB,它找不到程序集,它是无法解析依赖项的调用应用程序(在您的情况下为nunit-agent-x86.exe).
确保所有需要的文件都是通过 ConsoleApplication4 的编译生成的,并放置在可执行文件旁边(例如任何需要的程序集 DLL、运行时 DLL、.config 文件等)
一旦确定发生这种情况,请使用 --no-shadow-copy 命令行开关启动 NUnit,或从 GUI 工具将其设置为配置参数。正如 Bush 所说,NUnit 通常会将测试中的文件复制到单独的目录中,并且可能会留下重要文件。
如果 Matlab 创建的类需要某种特定的运行时,请确保它正确安装在您运行测试/使用 Excel/ReSharper 的计算机中。
在这个级别上,我不会尝试摆弄大会决议流程:请总结您链接的文章中的内容,因为它是付费墙,并尝试使用 NUnit 的无阴影复制设置。
| 归档时间: |
|
| 查看次数: |
2661 次 |
| 最近记录: |