1

我最近在将 VB.NET 解决方案从 VS2005 升级到 VS2010 时遇到了一些相当令人费解的行为。作为参考,该解决方案以 .NET 2.0 为目标,并且在转换之前在调试器中运行没有错误。除了 IDE 更改之外,公司还认为将我的设备从 Win XP (x86) 刷新到 Win 7 (x64) 是合适的。

现在我已经将解决​​方案转换为 VS2010,一旦调试器加载,我就会收到一个 Socket 异常(详情如下)。这只发生在调试器中。在其发布配置中构建解决方案会生成一个正确安装和运行且无错误的 MSI。

收到的异常详情如下:

System.Net.Sockets.SocketException was unhandled
  Message=An invalid argument was supplied
  Source=System
  ErrorCode=10022
  NativeErrorCode=10022
  StackTrace:
       at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
       at System.Net.Sockets.TcpListener..ctor(IPAddress localaddr, Int32 port)
       at System.Runtime.Remoting.Channels.Tcp.TcpServerChannel.SetupChannel()
       at System.Runtime.Remoting.Channels.Tcp.TcpServerChannel..ctor(IDictionary properties, IServerChannelSinkProvider sinkProvider, IAuthorizeRemotingConnection authorizeCallback)
       at System.Runtime.Remoting.Channels.Tcp.TcpChannel..ctor(IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.RegisterChannel(Boolean SecureChannel)
       at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       at FSASYSTEM.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

真正令人困惑的部分是,这个异常是在我的单行代码执行之前生成的。Main 方法是通过 VB.NET(托管代码)生成的,我无法对其进行断点,在其中捕获错误(据我了解,由于内核/应用程序上下文切换),也无法对其进行符号调试。

一个可能的解决方法是针对另一个 .NET 框架版本,但是我真的很想了解为什么会发生这种情况。我不明白为什么这样的错误只会出现在调试器中而不是发布的代码中。而且,是的,我已经尝试重新启动机器以确保没有任何剩余的套接字仍在侦听,从而导致绑定失败。

提前感谢您的时间和帮助。

4

1 回答 1

1

经过大量的工作和大量的创意咒骂,我能够解决我的问题。事实证明,这个问题与从网络位置运行代码有关。我们公司正在迁移到 ClearCase,它将所有代码存储在一个伪网络驱动器中。事实证明,.NET 4 默认删除了在“远程”主机上定位程序集的能力。由于我的代码似乎在 M: 驱动器上,我的猜测是运行时拒绝加载特定程序集。

为了解决这个问题,我在 app.config 中添加了以下标签:

<runtime>
  <loadFromRemoteSources enabled="true"/>
</runtime>

这似乎已经解决了这个问题。但是,如果有人知道通过虚拟网络解析程序集是如何生成特定错误消息的,我很想听听。此外,如果要相信互联网,这种安全措施是在 .NET 4 中引入的,但尽管我已经明确针对框架 2.0,但它仍然会引起问题。

希望这可以为人们节省大量时间。而且,为了您的文学乐趣,一些补充阅读:

http://through-the-interface.typepad.com/through_the_interface/2011/07/loading-blocked-and-network-hosted-assemblies-with-net-4.html

无法加载文件或程序集 HRESULT:0x80131515(将控制器添加到在网络驱动器上具有程序集引用的 MVC 项目时)

于 2012-09-11T22:50:46.037 回答