2

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

System.Runtime.InteropServices.SEHException was unhandled
  • ErrorCode=-2147467259 HResult=-2147467259 Message=外部组件抛出异常。源=hhCSEvalClientTest
    StackTrace:在 E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs:Microsoft.MSR 的第 123 行中的 Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.OnGeneralException(Exception ex) .CNTK.Extensibility.Managed.CSEvalClient.Program.EvaluateModelSingleLayer() 在 E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs:Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient 的第 171 行E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs 中的 .Program.Main(String[] args):System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,String[] args) 的第 69 行Microsoft.VisualStudio 中的 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)。HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart() InnerException:Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart() InnerException:

任何解决此问题的帮助将不胜感激!

4

2 回答 2

1

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

于 2016-11-18T21:27:32.373 回答
0

最有可能的是,您缺少一些引用的本机 DLL。查看这个相关的 SO question以获得 DLL 列表。这些需要与您的主要可执行文件位于同一目录中。

请注意,您必须为所有使用 DLL 或 EXE 添加正确的引用集EvalWrapper,这很麻烦。我发现使用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在重新加载项目后在项目的引用中看到对的引用。

于 2016-11-18T10:51:30.370 回答