使用xsd.exe生成架构

使用xsd.exe生成架构,xsd,Xsd,我正在尝试从带有xsd.exe的程序集生成某些类型的模式 以下是命令行: xsd.exe TestAssemby.dll /t:TestType 这是我得到的错误: 错误:处理“TestAssemby.dll”时出错。 无法加载一个或多个请求的类型。有关详细信息,请检索LoaderExceptions属性 我将引用的dll复制到文件夹中,该文件夹位于 但仍然会得到相同的错误 我有问题: 这种错误的可能原因是什么 如何使用LoaderExceptions属性?(示例将非常有用) 我一直在努力解

我正在尝试从带有xsd.exe的程序集生成某些类型的模式 以下是命令行:

xsd.exe TestAssemby.dll /t:TestType
这是我得到的错误:

错误:处理“TestAssemby.dll”时出错。 无法加载一个或多个请求的类型。有关详细信息,请检索LoaderExceptions属性

我将引用的dll复制到文件夹中,该文件夹位于

但仍然会得到相同的错误

我有问题:

  • 这种错误的可能原因是什么
  • 如何使用LoaderExceptions属性?(示例将非常有用)

我一直在努力解决这个问题,但未能成功地让xsd.exe从我的机器上的命令行从dll中的类生成架构

最终,我启动了一个WindowsXP虚拟机来运行xsd.exe,它运行得很好,但可能不是一个令人满意的答案

无论出于何种原因,当我在Visual Studio中创建一个新的控制台(或任何其他类型的)应用程序时,我都能够添加对xsd.exe的引用,并以编程方式对其进行引用,如下所示:

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

  • 启动开发人员命令提示符
  • 更改到输出文件夹“cd c:\myproject\bin”
  • 运行xsd.exe“xsd myproject.dll/t:MyClass”

  • 对于我自己来说,最终的答案非常简单:我在同一个文件夹中缺少依赖程序集。
    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标准库。