CNTK c#Wrapper throws"外部组件抛出异常。"对于EvalWrapper

时间:2016-11-18 01:04:37

标签: c# cntk

我在GitHub上有来自Microsoft的CNTK的CSEvalClientTest.csproj的代码。我已经创建了一个新的Visual Studio 2015 c#控制台应用程序,粘贴在CSEvalClientTest.csproj的代码中,修复了引用并让它运行。但它并没有走得太远。在这行源代码中:                 使用(var model = new IEvaluateModelManagedF()) 它抛出了这个例外:

System.Runtime.InteropServices.SEHException was unhandled
  • ErrorCode = -2147467259 HResult = -2147467259 Message = External 组件抛出异常。来源= hhCSEvalClientTest
    堆栈跟踪:       在Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.OnGeneralException(异常) ex)in E:\用户\哈尔\来源\工作区\ hhCSEvalClientTest \ hhCSEvalClientTest \ hhCSEvalClientTest \的Program.cs:行 123       在Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.EvaluateModelSingleLayer() 在 E:\用户\哈尔\来源\工作区\ hhCSEvalClientTest \ hhCSEvalClientTest \ hhCSEvalClientTest \的Program.cs:行 171       在Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.Main(String [] args)in E:\用户\哈尔\来源\工作区\ hhCSEvalClientTest \ hhCSEvalClientTest \ hhCSEvalClientTest \的Program.cs:行 69       在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)       在System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)       在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()       在System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔值 preserveSyncCtx)       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)       在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)       在System.Threading.ThreadHelper.ThreadStart()InnerException:

非常感谢任何解决此问题的帮助!

2 个答案:

答案 0 :(得分:1)

您是否可以将CNTK Nuget Package用于C#应用程序?这将消除关于dll引用的大多数麻烦。您可以查看https://github.com/Microsoft/CNTK/tree/master/Examples/Evaluation/CSEvalClient中的示例以获取更多信息。

答案 1 :(得分:0)

最有可能的是,您缺少一些引用的本机DLL。查看this related SO question以获取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的引用。