開発用PC(Window 7)にインストールして動作できるアプリを作成しました。
他のクライアントコンピューター(XP SP3、2および1)では、エラーなしでインストールされますが、起動できません。タスクマネージャでは、アプリケーションが自動的に終了する前に、アプリケーションが短時間メモリを消費することがわかります。
開発用PCとさまざまなクライアント間で.NET 3.5の一貫性を確認しましたXPマシンは次のとおりです。
eventvwr次の警告をキャッチしました:
¬º˛¿‡–Õ: ¥ÌŒÛ
¬º˛¿¥‘¥: .NET Runtime
¬º˛÷÷¿‡: Œfi
¬º˛ ID: 1026
»’∆⁄: 2011-10-18
¬º˛: 15:18:32
”√ªß: N/A
º∆À„ª˙: WWW-9DB69D5A3AF
√Ë ˆ:
Application: Foo.exe
Framework Version: v4.0.30319
Description: ”…”⁄Œ¥æ≠¥¶¿Ìµƒ“Ï≥££¨Ω¯≥Ã÷’÷π°£
“Ï≥£–≈œ¢: System.Windows.Markup.XamlParseException
∂—’ª:
‘⁄ System.Windows.Markup.XamlReader.RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri)
‘⁄ System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri)
‘⁄ System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri)
‘⁄ System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean)
‘⁄ System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext)
‘⁄ System.Windows.Application.LoadComponent(System.Uri, Boolean)
‘⁄ System.Windows.Application.DoStartup()
‘⁄ System.Windows.Application.<.ctor>b__1(System.Object)
‘⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
‘⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
‘⁄ System.Windows.Threading.DispatcherOperation.InvokeImpl()
‘⁄ System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
‘⁄ System.Threading.ExecutionContext.runTryCode(System.Object)
‘⁄ System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
‘⁄ System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
‘⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
‘⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
‘⁄ System.Windows.Threading.DispatcherOperation.Invoke()
‘⁄ System.Windows.Threading.Dispatcher.ProcessQueue()
‘⁄ System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
‘⁄ MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
‘⁄ MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
‘⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
‘⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
‘⁄ System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
‘⁄ MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
‘⁄ MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
‘⁄ System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
‘⁄ System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
‘⁄ System.Windows.Threading.Dispatcher.Run()
‘⁄ System.Windows.Application.RunDispatcher(System.Object)
‘⁄ System.Windows.Application.RunInternal(System.Windows.Window)
‘⁄ System.Windows.Application.Run(System.Windows.Window)
‘⁄ System.Windows.Application.Run()
‘⁄ FooSoftware.App.Main()
”–πÿ∏¸∂‡–≈œ¢£¨«Î≤Œ‘ƒ‘⁄ http://go.Microsoft.com/fwlink/events.asp µƒ∞Ô÷˙∫Õ÷ß≥÷÷––ƒ°£
このXamlParseExceptionが原因で、アプリがXP Window Machineで起動しなくなりました。何が起こっていますか?
XamlParseException
は、アプリケーションの起動時に問題が発生したときに発生する一般的なエラーです。 XamlParseExceptionだけでなく、問題の根本を特定するのに役立つ内部例外も追跡するように、アプリケーションのスタートアップコードを変更することをお勧めします。以下に例を示します。
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// hook on error before app really starts
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
base.OnStartup(e);
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// put your tracing or logging code here (I put a message box as an example)
MessageBox.Show(e.ExceptionObject.ToString());
}
}
}
まず第一に、VS2010で構築した場合は実際に幸運が得られます..しかし、実際には targeted の lower バージョンの.Net( 3.5、さらには2.0)。
少しのコードを投稿すれば間違いなく役立ちます。
アプリケーションに必要なすべてのファイル(app.configなど)をコピーしたことを確認してください。
このリンクは似ています:
Windows 7マシンで作成/コンパイルされた.NET 4プログラムは、XPでは実行されません
そして、次の優れたトラブルシューティングのヒントを示しています。
.NET 3.5を対象としていましたが、クライアントハット.NET 4をインストールして使用しました。文字列
Framework Version: v4.0.30319
これを教えてくれます。クライアントが.NET 3.5を実際に使用するように強制するには、アプリケーションに App.config を追加して、以下を追加する必要があります。
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
.NET 4はXAMLを異なる方法で処理するため、例外が発生している可能性があります。アプリケーションを.NET 4で実行しようとしましたか? App.configが提供されていない場合は、.NET Framework 3.5をターゲットにしているにもかかわらず、.NET Framework 4でアプリケーションをテストしました。クライアントが十分に素晴らしければ、ダンプファイルを作成させて、簡単に直接デバッグできるようにします。 SysInternalsツールスイートから Procdump をダウンロードし、アプリケーションとともにクライアントに送信します。彼に実行させる
procdump -ma -e -t -x foo.exe %temp%\dump.dmp
これにより、未処理の例外ごとに完全なプロセスダンプが生成され、プロセスが%TEMP%ディレクトリで終了すると別の例外が生成されます。 Visual Studio 2010では、ダンプ分析のサポートが大幅に強化されているため、Visual Studio 2010内で分析できます。Windbg(32ビット ここ )をダウンロードできない場合は、ダンプを読み込んで入力します
!-analyze -v
最後の例外が何であったかを確認します。これでうまくいくはずです。 右デバッグdll (.NET 2,3,3.5の場合はsos.dll、.NET 4の場合はclr.dll)をロードする管理拡張機能に問題がある可能性がありますが、オンラインのチュートリアルはたくさんありますどうやってするの。これに加えて、例外ハンドラをアプリケーションに追加して、アプリケーションが予期しない方法で終了したときにNiceログファイルを取得することをお勧めします。
出力が正しいスタックにつながらなかった場合は、!ClrStackと!Threadsを使用して、スタックに例外があるスレッドを見つけます。
リモートデバッグできます。基本的に、これはリモートデバッグサーバーをターゲットマシンにインストールし、アプリケーションの起動時にVisual Studioからアタッチすることで行われます。いくつかの詳細情報はここで見つけることができます: http://msdn.Microsoft.com/en-us/library/bt727f1t.aspx そしてここにやや高齢のチュートリアルがあります: http://www.cprogramming.com/tutorial/visual_studio_remote_debugging.html
デバッグシンボル(pdbs)を使用してデプロイする必要があり、デバッグするソフトウェアは、コードが含まれているバージョンと同じバージョンである必要があることに注意してください。
通常、プロセスの間にログファイルを配置するので、プログラムの流れがわかります。
これがコンソールアプリケーションの場合は、Console.WriteLine(some string)を配置してから、Console.ReadLine()を最後に配置して、プログラムの実行を一時停止できます。
最近、同様の問題に遭遇しました。私が抱えていた問題は、Windows 7で.ico(アイコンファイル)を使用していたことです。しかし、XPではこれらのサポートはありません。アプリケーションでアイコンファイルを使用している場合は、それらを削除してみてください。これで問題が解決するかどうかを確認してください。
コードが機能するまで、コードの行とクラス/メソッド全体をコメントアウトし始めます(または、すべてをコメントアウトすることから始めます)。その後、ゆっくりとコード行やメソッド呼び出しなどを導入し始めます。それが壊れるまで。これにより、問題の原因となっている特定のコード/クラスまたは参照のアイデアが得られます。これは確かに退屈な方法ですが、同時に、かなり機械的なものであり、1時間ほどで、犯人についてかなり良い考えを持つはずです。
「TryCathcWhen」関連の行は、起動時に未処理の例外を考えさせます。または起動時にcatchブロックで例外がスローされます。
スタートアップコードを確認すると役立ちます。
いくつかのコメントされたコードは、出力ファイルの実行に影響して、アプリで発生したような動作をすることを聞きました(特にVS 2010では他の以前のバージョンではありません)が、反対側では、昨年私が使用したプログラムに取り組んでいました開発コンポーネントスイート。あなたはその亀裂が.Net Framework 3.5で動作することを知っているので、私のプログラムプラットフォームは.Net Framework 4でした。あなたのアプリでも同じことが起こり、私のapp.iで起こったことが私のプラットフォームを3.5にダウングレードしなければならなかったのです経験はあなたが男を助ける。
私は別のことを言いたい、このいくつかのエラーはCPUアーキテクチャに依存しません。それについて心配しないでください。
幸運を。アリ・フォルギ
デバッグで動作する.Net 2.0アプリがありましたが、リリースビルドではありません(インストール後)。アプリケーションから直接ログを取得していませんでした。エラーは.NETから直接発生しました。問題は、メイン内に静的なボイドMAIN()を持つ独自のプログラムクラスを作成し、try...catch..finally
ブロック。何らかの理由で、.NETはfinally
で窒息していました。あなたのプログラムにはそのようなものがありますか?
これは、.NET 3.5/4のインストールが失敗した/正常に完了していないマシンで発生するのを見てきました。ただし、これも非常にまれです。
マシンにリモートデバッグをインストール(かなり簡単なプロセス)してから、Visual Studioでターゲットとしてリモートマシンを設定し、デバッグモードでプログラムを実行する必要があります。その後、プログラムがリモートマシンで起動し、Visual Studio内で完全なエラーが発生します。
これは本当に一般的なエラーです。私の場合、新しくインストールしたアプリケーションは、権限が不十分なため、独自のイベントソースを作成できませんでした。 「管理者」モードでアプリを1回実行することで解決((いもの)。すべての内部例外が処理されることを確認してください。イベントも情報源として適しています。
私の場合、ユーザーが私が開発していた同じ.Net FWバージョンをインストールすると、問題は解決しました。 (FW 4.5.1があり、ユーザーはFW 4.0を持っていました)。
そのため、FWバージョンを確認します。
http://msdn.Microsoft.com/library/hh925568(v = vs.110).aspx
実行を再試行する前に、まったく同じものをインストールします