CNTK c# Wrapper抛出“外部组件抛出异常”.EvalWrapper
本文关键字:组件 抛出异常 EvalWrapper 外部 Wrapper 抛出 CNTK | 更新日期: 2023-09-27 18:18:25
我有CSEvalClientTest的代码。从微软的CNTK在GitHub上。我已经创建了一个新的Visual Studio 2015 c#控制台应用程序,粘贴在代码从CSEvalClientTest。Csproj,修复了引用并使其运行。但它不会走得太远。在这行源代码中:using (var model = new evaluatemodelmanagedf ())它抛出这个异常:
System.Runtime.InteropServices.SEHException was unhandled
- ErrorCode=-2147467259 HResult=-2147467259 Message=External组件抛出了异常。源= hhCSEvalClientTest
加:Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.OnGeneralException(例外前女友)E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行123在Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.EvaluateModelSingleLayer ()在E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行171Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.Main (String []args)E: '工作区' '哈尔' '用户来源hhCSEvalClientTest ' hhCSEvalClientTest ' hhCSEvalClientTest ' Program.cs:行69在System.AppDomain。_nExecuteAssembly(运行时汇编程序集,字符串[]args)在System.AppDomain。ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()System.Threading.ExecutionContext.RunInternal (ExecutionContextexecutionContext, ContextCallback, callback,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext。运行ExecutionContext ExecutionContext, ContextCallback callback,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext。运行(ExecutionContext, ExecutionContext, ContextCallback, callback, Object state)at System.Threading.ThreadHelper.ThreadStart() InnerException:
任何帮助解决这个问题将非常感谢!
你会为你的c#应用程序使用CNTK Nuget包吗?这将消除有关dll引用的大多数头痛问题。您可以查看https://github.com/Microsoft/CNTK/tree/master/Examples/Evaluation/CSEvalClient中的示例以获取更多信息。
很可能您缺少了一些引用的本机dll。请查看与此相关的SO问题以获取dll列表。这些需要驻留在与主可执行文件相同的目录中。
请注意,您必须为使用EvalWrapper
的所有dll或exe添加正确的引用集,这很麻烦。我发现使用您在项目文件中引用的props
文件很有帮助。这是我的cntk_evalwrapper.props
看起来像(你需要调整你的CNTK构建的位置)
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="c:/git/cntk/x64/Release_CpuOnly/EvalDll.dll">
<Link>evaldll.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="c:/git/cntk/x64/Release_CpuOnly/EvalDll.lib">
<Link>EvalDll.lib</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="c:/git/cntk/x64/Release_CpuOnly/Math.dll">
<Link>Math.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="c:/git/cntk/x64/Release_CpuOnly/libiomp5md.dll">
<Link>libiomp5md.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="c:/git/cntk/x64/Release_CpuOnly/mkl_cntk_p.dll">
<Link>mkl_cntk_p.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<Reference Include="EvalWrapper">
<HintPath>c:/git/cntk/x64/Release_CpuOnly/EvalWrapper.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
在你的项目文件yourproject.csproj
中,包括这个道具文件,这样你的项目文件的顶部看起来像:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..'cntk_evalwrapper.props" />
再次调整相对路径,使其正确地从项目文件指向props文件。如果工作正常,一旦重新加载项目,您应该在项目的引用中看到对EvalWrapper
的引用