使用xsd.exe生成架构
我正在尝试从带有xsd.exe的程序集生成某些类型的模式 以下是命令行:使用xsd.exe生成架构,xsd,Xsd,我正在尝试从带有xsd.exe的程序集生成某些类型的模式 以下是命令行: xsd.exe TestAssemby.dll /t:TestType 这是我得到的错误: 错误:处理“TestAssemby.dll”时出错。 无法加载一个或多个请求的类型。有关详细信息,请检索LoaderExceptions属性 我将引用的dll复制到文件夹中,该文件夹位于 但仍然会得到相同的错误 我有问题: 这种错误的可能原因是什么 如何使用LoaderExceptions属性?(示例将非常有用) 我一直在努力解
xsd.exe TestAssemby.dll /t:TestType
这是我得到的错误:
错误:处理“TestAssemby.dll”时出错。
无法加载一个或多个请求的类型。有关详细信息,请检索LoaderExceptions属性
我将引用的dll复制到文件夹中,该文件夹位于
但仍然会得到相同的错误
我有问题:
- 这种错误的可能原因是什么
- 如何使用LoaderExceptions属性?(示例将非常有用)
namespace XsdExeTest
{
class Program
{
static void Main(string[] args)
{
var rgs = new string[]
{
@"C:\publish\bin\SoAndSo.Library.dll",
"/type:SoAndSoNamespace.SoAndSoClassName"
};
XsdTool.Xsd.Main(rgs);
}
}
}
。我得到的结果是“编写文件schema0.xsd。这是一种奇怪的解决方法,但是如果手头没有虚拟机,那么比启动虚拟机容易得多
基于我在网上找到的帮助信息不足,我猜不是每个人都有这个问题。我想扩展ardave的答案。这就是如何发现WTF在xsd.exe中出错的方法
static void Main(string[] args)
{
var rgs = new string[]
{
@"{path_to_dll}",
"/type:{type_name}"
};
AppDomain.CurrentDomain.FirstChanceException += (s, e) =>
{
string error = e.Exception.ToString();
var typeLoadException = e.Exception as ReflectionTypeLoadException;
if (typeLoadException != null)
{
foreach (var exception in typeLoadException.LoaderExceptions)
{
error += Environment.NewLine + Environment.NewLine +
exception.ToString();
}
}
Console.WriteLine(error);
};
XsdTool.Xsd.Main(rgs);
Console.ReadLine();
}
因此,诀窍是将XSD.exe作为您自己的测试应用程序的一部分运行,并在调用
XsdTool.XSD
之前注册AppDomain.CurrentDomain.FirstChanceException
,而不是将dll复制到其他位置,而是从构建的输出文件夹中运行XSD.exe
对于我自己来说,最终的答案非常简单:我在同一个文件夹中缺少依赖程序集。
xsd.exe必须能够加载所有依赖类等,才能构建xsd
为了测试您的情况是否如此,您可以在VisualStudio(或IDE)中创建一个新项目,并引用要为其生成XSD的类的程序集。请确保引用正在使用的特定库文件。XSD.exe
。如果新创建的项目可以使用它并查看该类,则依赖关系良好,您至少可以排除这种情况。这是一个很晚的答案,但它可能有助于反对同样的问题
如果xsd.exe因现有项目(解决方案的一部分)的类型加载异常而退出,则可以运行调试会话,而无需编写任何代码来捕获异常并对其进行检查
以这种方式配置调试会话:在项目的项目属性中,在调试页面上,选择启动外部程序
输入xsd.exe的完整路径,例如:
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools\x64\xsd.exe
在开始选项中,指定所需的命令行参数:
YourAssembly.dll /t:Your.Type
转到异常设置(调试->窗口->异常设置)并激活系统.Reflection.ReflectionTypeLoadException
异常。如果愿意,您确实可以激活所有CLR异常
现在,按F5启动调试会话
XSD控制台窗口应该出现。然后,Visual Studio应该中断该过程并显示抛出的异常弹出窗口。在这里,您可以检查类型加载异常
您还应该在局部变量窗口中看到异常
事实上,这也适用于任何程序集,您只需要一个解决方案和一个项目来启动调试会话。这甚至可以是一个空的解决方案/项目。这为我做到了。我收到一个错误,说找不到招摇过市方法(IOperationFilter.Apply),尽管它是显式实现的。所以我对整个类进行了注释,它成功了。当然,我在生成模式后取消了注释,以便重新获得Swagger。尽管这对我不起作用,但我喜欢这个答案,因为它承诺了一个解决方案,基本上只需要在项目启动集中增加一个小条目tings.json文件。我的项目是.NET Core,我从VS收到一条消息,说“目标进程已退出,但未引发CoreCLR启动事件。确保将目标进程配置为使用.NET Core。如果目标进程未在.NET Core上运行,则可能会出现这种情况。“由于xsd.exe是一个.NET Framework程序集,这种方法似乎不适用于.NET核心程序集。根据我更好的判断,我尝试使用.NET Standard 2.1项目进行此操作,但在未引发CoreCLR started事件的情况下退出了目标进程。确保将目标进程配置为使用.NET Core。如果目标进程未在.NET Core上运行,则可能会出现这种情况。程序“[8200]xsd.exe”已退出,代码为1(0x1)。我假设xsd.exe也不能加载和反映.NET标准库。