为什么我的发行版仅适用于我的机器?

时间:2016-09-09 14:40:12

标签: c# wpf visual-studio visual-studio-2013 visual-studio-2015

我在Windows 64bit上使用Visual Studio 2015.我有这个带有C ++后端的WPF项目,它使用了几个额外的软件包,如OpenCV,EmguCV和DevExpress。

现在,如果我以Release运行,它编译得很好。此外,如果我通过资源管理器转到当前目录并导航到bin -> Release然后执行.exe文件,它也运行正常。

问题:该项目无法在任何其他计算机上运行:如果我复制整个 Release 文件夹并将其粘贴到另一台计算机上并尝试执行,则会弹出a" 无法加载文件或程序集"错误。请参阅Error Here以及下面的完整错误。

洞察力:那些目标机器曾经能够以相同的方式执行发布(复制/粘贴或安装程序)。该项目的目标是.Net framework 4.5,需要2013 + 2015年可再发行文件。一切都安装在目标机器上。错误令人讨厌的Dll也存在于Release文件夹中。当我构建一个安装程序(使用Inno Setup)时,我会看到所有必需的和现有的Dll被包含在内(OpenCv stuff和DevExpress)。

在" 解决方案资源管理器 - >中有10个未显示的OpenCv Dll。参考"但实际上存在于发布文件夹中(我们将它们粘贴在一起)。现在,如果我从MY Release Folder中删除这些文件,我会得到完全相同的错误。另一方面,如果我将它们粘贴到他们的释放文件夹中,则错误仍然存​​在。

" 解决方案资源管理器 - >参考文献 - >属性 - >本地副本"所有文件都设置为true。我目前构建为x86,因为如果我构建为x64,我会收到此错误:

  

错误NuGet错误:无法找到版本' 2.4.8'包' OpenCV.overlay-x64_v120_Release'。 C:\ Users \用户BLA \桌面\ BLA \包\ OpenCV.2.4.8 \建立\天然\ OpenCV.targets

可能是什么问题?

完成错误:

  

Fatal @ 9/9/2016 9:18:19 AM - CurrentDomainOnUnhandledException   v2.0.1.0 - 异常信息:System.Windows.Markup.XamlParseException:   在类型' bla.MainWindow'上调用构造函数。那   匹配指定的绑定约束引发异常。 --->   System.IO.FileNotFoundException:无法加载文件或程序集   ' bla.bla.bla.dll'或其中一个依赖项。该   无法找到指定的模块。

     

在bla.MainWindow..ctor()

     

---内部异常堆栈跟踪结束---

     

在System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader,   IXamlObjectWriterFactory writerFactory,Boolean   skipJournaledProperties,Object rootObject,XamlObjectWriterSettings   设置,Uri baseUri)

     

在System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader)   xamlReader,Boolean skipJournaledProperties,Object rootObject,   XamlAccessLevel accessLevel,Uri baseUri)

     

在System.Windows.Markup.XamlReader.LoadBaml(Stream stream,   ParserContext parserContext,Object parent,Boolean closeStream)

     

在System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream   stream,ParserContext pc)

     

在System.Windows.Application.LoadComponent(Uri resourceLocator,   Boolean bSkipJournaledProperties)

     

在System.Windows.Application.DoStartup()

     

在System.Windows.Application。< .ctor> b__1_0(未使用的对象)

     

在   System.Windows.Threading.ExceptionWrapper.InternalRealCall(代表   callback,Object args,Int32 numArgs)

     

在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object   source,Delegate callback,Object args,Int32 numArgs,Delegate   catchHandler)

     

在System.Windows.Threading.DispatcherOperation.InvokeImpl()

     

在   System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(对象   状态)

     

在System.Threading.ExecutionContext.RunInternal(ExecutionContext   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)

     

在System.Threading.ExecutionContext.Run(ExecutionContext   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)

     

在System.Threading.ExecutionContext.Run(ExecutionContext   executionContext,ContextCallback回调,对象状态)

     

在   MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext   executionContext,ContextCallback回调,对象状态)

     

在System.Windows.Threading.DispatcherOperation.Invoke()

     

在System.Windows.Threading.Dispatcher.ProcessQueue()

     

在System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd,Int32)   msg,IntPtr wParam,IntPtr lParam,Boolean&处理)

     

在MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,   IntPtr lParam,Boolean&处理)

     

在MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)at at   System.Windows.Threading.ExceptionWrapper.InternalRealCall(代表   callback,Object args,Int32 numArgs)

     

在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object   source,Delegate callback,Object args,Int32 numArgs,Delegate   catchHandler)

     

在   System.Windows.Threading.Dispatcher.LegacyInvokeImpl(的DispatcherPriority   优先级,TimeSpan超时,委托方法,对象args,Int32   numArgs)

     

在MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd,Int32 msg,   IntPtr wParam,IntPtr lParam)

     

at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)

     

在System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame)   框架)

     

在System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame   帧)

     

在System.Windows.Application.RunDispatcher(Object ignore)

     

在System.Windows.Application.RunInternal(窗口窗口)

     

在System.Windows.Application.Run(窗口窗口)

     

在bla.App.Main()

2 个答案:

答案 0 :(得分:1)

我发现此链接可能对您有所帮助

I want a solution for this : Please make sure that the file is accessible and that it is a valid assembly or COM component

标记答案是:

该文件是本机DLL,这意味着您无法通过添加引用将其添加到.NET项目中......您可以通过DllImport使用它(请参阅http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

答案 1 :(得分:0)

右键单击项目中的引用,然后再次重新添加OpenCV的声明,然后刷新并重新构建解决方案。还要确保项目确实以.Net framework 4.5为目标,因为如果它以.net客户端框架为目标,有时会出现相同的错误。