最近、VB.NETソリューションをVS2005からVS2010にアップコンバートしているときに、やや厄介な動作に遭遇しました。参考までに、ソリューションは.NET 2.0を対象としており、変換前にデバッガーでエラーなしで実行されていました。IDEの変更に加えて、企業はデバイスをWin XP(x86)からWin 7(x64)に更新するのに適していると考えています。
ソリューションをVS2010に変換したので、デバッガーがロードされるとすぐにソケット例外を受け取ります(詳細は以下を参照)。これはデバッガーでのみ発生します。リリース構成でソリューションを構築すると、エラーなしで正しくインストールおよび実行される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:
本当に紛らわしいのは、この例外が私のコードの1行が実行される前に生成されることです。MainメソッドはVB.NET(マネージコード)を介して生成され、ブレークポイントを設定したり、エラーをトラップしたり(カーネル/アプリケーションのコンテキストの切り替えが原因で)、シンボリックにデバッグしたりすることはできません。
これに対する可能な修正は、別の.NET Frameworkバージョンをターゲットにすることですが、なぜこれが発生するのかを理解することに本当に興味があります。このようなエラーがデバッガーでのみ発生し、リリースされたコードでは発生しない理由を理解できません。そして、はい、私はマシンを再起動して、まだリッスンしている残りのソケットがないことを確認しようとしました。これにより、バインディングが失敗します。
よろしくお願いします。