gpt4 book ai didi

wpf - 在 WPF 应用程序中调试 Silverlight

转载 作者:行者123 更新时间:2023-12-04 22:06:07 24 4
gpt4 key购买 nike

我正在开发一个 WPF 应用程序,其中包含一个加载 Silverlight 应用程序的 webbrowser 控件。我希望能够从 Visual Studio (F5) 启动应用程序并将调试器附加到 Silverlight 代码。但是,我对此没有任何运气。

我目前能做的最好的事情是在不附加的情况下启动应用程序,然后在它启动并运行后,使用 Silverlight 作为要调试的指定类型的代码手动附加到进程,这是有效的。 (当我使 Web 浏览器控件加载 Silverlight 应用程序时,它会在我的 Silverlight 代码中遇到断点)。我已经编写了一些宏来自动执行此启动/附加操作,但它仍然不是最好的。

我尝试将 WPF 应用程序指定为在启动/调试 Silverlight 应用程序时运行的外部程序,但 Visual Studio 附加到想要调试托管 .NET 代码的进程。

有任何想法吗?理想情况下,我真的很想附加到进程并调试托管 .NET 和 Silverlight 代码,但我认为这是不可能的。我真的很想在启动时自动附加到 Silverlight 代码,以便我可以轻松调试 Silverlight 应用程序的所有问题,包括那些在加载时出现的问题。

最佳答案

感谢您的想法布兰多夫和胖子。 Brandorf's 几乎可以让我到达我想去的地方,但确实需要我的 SL 应用程序能够独立运行。我真的想只有一个应用程序,它是wpf和silverlight,正在调试SL端。

在我问这个问题很久之后(我忘了我在这里问过这个问题),我实际上拼凑了一个我非常满意的解决方案。我在应用程序的 WPF/.NET 端使用 Visual Studio 自动化来查找所有正在运行的 Visual Studio 实例,找出哪个生成了我的 exe(因为它通常位于 vcproj/sln 文件夹下方的文件夹中),然后使用 Visual Studio 自动化将 VS 附加到应用程序,调试 Silverlight 代码。完成此操作后,我将加载我的 Silverlight 内容。

它真的很好用。您最终会得到一个应用程序,该应用程序每次运行时都会找到一个调试器附加到自身上(因此您可能只希望在调试版本中使用此代码,或者以某种方式可以关闭)。因此,只要您想调试 Silverlight 端,您只需从 Visual Studio 使用 ctrl-F5(无需调试即可启动)启动应用程序。

这是我的代码:

#if DEBUG

using System;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.InteropServices;
using System.IO;

namespace Launcher
{
//The core methods in this class to find all running instances of VS are
//taken/inspired from
//http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
class DebuggingAutomation
{
[DllImport("ole32.dll")]
private static extern int GetRunningObjectTable(int reserved,
out UCOMIRunningObjectTable prot);

[DllImport("ole32.dll")]
private static extern int CreateBindCtx(int reserved,
out UCOMIBindCtx ppbc);
///<summary>
///Get a snapshot of the running object table (ROT).
///</summary>
///<returns>
///A hashtable mapping the name of the object
///in the ROT to the corresponding object
///</returns>
private static Hashtable GetRunningObjectTable()
{
Hashtable result = new Hashtable();

int numFetched;
UCOMIRunningObjectTable runningObjectTable;
UCOMIEnumMoniker monikerEnumerator;
UCOMIMoniker[] monikers = new UCOMIMoniker[1];

GetRunningObjectTable(0, out runningObjectTable);
runningObjectTable.EnumRunning(out monikerEnumerator);
monikerEnumerator.Reset();

while (monikerEnumerator.Next(1, monikers, out numFetched) == 0)
{
UCOMIBindCtx ctx;
CreateBindCtx(0, out ctx);

string runningObjectName;
monikers[0].GetDisplayName(ctx, null, out runningObjectName);

object runningObjectVal;
runningObjectTable.GetObject(monikers[0], out runningObjectVal);

result[runningObjectName] = runningObjectVal;
}

return result;
}

/// <summary>
/// Get a table of the currently running instances of the Visual Studio .NET IDE.
/// </summary>
/// <param name="openSolutionsOnly">
/// Only return instances that have opened a solution
/// </param>
/// <returns>
/// A list of the ides (as DTE objects) present in
/// in the running object table to the corresponding DTE object
/// </returns>
private static List<EnvDTE.DTE> GetIDEInstances(bool openSolutionsOnly)
{
var runningIDEInstances = new List<EnvDTE.DTE>();
Hashtable runningObjects = GetRunningObjectTable();

IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
while (rotEnumerator.MoveNext())
{
string candidateName = (string)rotEnumerator.Key;
if (!candidateName.StartsWith("!VisualStudio.DTE"))
continue;

EnvDTE.DTE ide = rotEnumerator.Value as EnvDTE.DTE;
if (ide == null)
continue;

if (openSolutionsOnly)
{
try
{
string solutionFile = ide.Solution.FullName;
if (!String.IsNullOrEmpty(solutionFile))
{
runningIDEInstances.Add(ide);
}
}
catch { }
}
else
{
runningIDEInstances.Add(ide);
}
}
return runningIDEInstances;
}

internal static void AttachDebuggerIfPossible()
{
if (System.Diagnostics.Debugger.IsAttached)
{
//Probably debugging host (Desktop .NET side), so don't try to attach to silverlight side
return;
}
var ides = GetIDEInstances(true);
var fullPathToAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
var potentials = new List<EnvDTE.DTE>();
foreach (var ide in ides)
{
var solutionPath = ide.Solution.FullName;
var topLevelSolutionDir = Path.GetDirectoryName(solutionPath);
var assemblyName = fullPathToAssembly;
if (assemblyName.StartsWith(topLevelSolutionDir, StringComparison.OrdinalIgnoreCase))
{
potentials.Add(ide);
}
}

EnvDTE.DTE chosenIde = null;
//If you have multiple ides open that can match your exe, you can come up with a scheme to pick a particular one
//(eg, put a file like solution.sln.pickme next to the solution whose ide you want to debug). If this is not a
//concern, just pick the first match.
if (potentials.Count > 0)
{
chosenIde = potentials[0];
}
var dbg = chosenIde != null ? (EnvDTE80.Debugger2)chosenIde.Debugger : null;

if (dbg != null)
{
var trans = dbg.Transports.Item("Default");

var proc = (EnvDTE80.Process2)dbg.GetProcesses(trans, System.Environment.MachineName).Item(Path.GetFileName(fullPathToAssembly));
var engines = new EnvDTE80.Engine[1];
engines[0] = trans.Engines.Item("Silverlight");

proc.Attach2(engines);
}
}
}
}
#endif

关于wpf - 在 WPF 应用程序中调试 Silverlight,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213880/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com