【问题标题】:CNTK c# Wrapper throws "External component has thrown an exception." for EvalWrapperCNTK c# Wrapper 抛出“外部组件已抛出异常”。对于 EvalWrapper
【发布时间】:2016-11-18 01:04:37
【问题描述】:

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

System.Runtime.InteropServices.SEHException was unhandled
  • 错误代码=-2147467259 HResult=-2147467259 消息=外部 组件抛出了异常。来源=hhCSEvalClientTest
    堆栈跟踪: 在 Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.OnGeneralException(异常 例如)在 E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs:line 123 在 Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.EvaluateModelSingleLayer() 在 E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs:line 171 在 Microsoft.MSR.CNTK.Extensibility.Managed.CSEvalClient.Program.Main(字符串 [] 参数)在 E:\Users\Hal\Source\Workspaces\hhCSEvalClientTest\hhCSEvalClientTest\hhCSEvalClientTest\Program.cs:line 69 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback 回调, 对象状态, Boolean 保留SyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() InnerException:

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

【问题讨论】:

    标签: c# cntk


    【解决方案1】:

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

    【讨论】:

    • 好点,是的 - 如果使用标准构建而不进行修改,Nuget 包应该比自定义引用更容易。
    • 感谢您的建议 - 我可能稍后再回复。现在,我希望我可以修复参考。我在使用 Git 时遇到了麻烦,并且从未使用过 Nuget。我想了解 CNTK,同时尽量减少启动和运行它所需的其他工具。
    • 经过这么多的挣扎,我认为周的建议是要走的路。使用 nuget 真的很简单。在 VS 中,使用 Tools/NugetPackageManger/ManagePackagesForSolution。选择 nuget.org,在“在线搜索”框中搜索“CNTK”。然后你可以选择哪些项目应该获得参考。
    【解决方案2】:

    您很可能遗漏了一些引用的本机 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 的引用。

    【讨论】:

    • 感谢您的快速回复。我正在努力添加其他 DLL。我可以毫无问题地添加和删除 EvalWrapper.dll。但是您链接中的其余部分因错误而失败:无法添加对“....dll”的引用。请确保该文件可访问并且它是有效的程序集或 COM 组件.。我已将 DLL 添加到您建议的目录中:..\obj\x64\Debug,但我仍然遇到同样的错误。我在谷歌上搜索了添加参考,并找到了很多不同的方法——没有一种感觉“正确”。你能指出我正确的方向吗?
    • EvalWrapper.dll 是您需要添加的唯一引用。对于所有其他 DLL,不要尝试将它们添加为引用 - 它们只必须位于与 EvalWrapper.dll 相同的目录中。我真的建议你走道具文件的方式。乍一看,弄乱 .csproj 文件可能会让人望而生畏,但让生活变得更容易。右键单击项目,“卸载项目”,然后“编辑项目文件”,进行编辑,然后“重新加载项目”。确保先保存项目文件的备份。
    • 再次感谢!我为此挣扎了一段时间,并取得了一些进展。 .csproj 文件的更改看起来不错。代码在下一条评论中。抱歉,我无法让格式正常工作。
    • schemas.microsoft.com/developer/msbuild/2003">
    • 我的项目构建良好。出现对 EvalWrapper 的引用,如果我删除它,它会在我重新打开项目时重新出现。当我从 Visual Studio 运行项目时,它会崩溃并显示 vshost.exe 已停止工作 一个问题导致程序停止正常工作。如果有可用的解决方案,Windows 将关闭程序并通知您。 这发生在代码中先前引发异常的同一点。
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2021-01-15
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多