使用xsd.exe生成模式

时间:2010-06-17 18:14:23

标签: xsd

我想从使用xsd.exe的程序集生成某种类型的模式 这是命令行:

xsd.exe TestAssemby.dll /t:TestType

这是我得到的错误:

  

错误:处理'TestAssemby.dll'时出错。   无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息

我将引用的dll复制到根据this找到的文件夹中。

但仍然会出现同样的错误

我有疑问:

  • 出现此类错误的原因可能是什么?
  • 应该如何使用LoaderExceptions属性? (例子将非常有帮助)

5 个答案:

答案 0 :(得分:2)

我已经与这个问题进行过斗争和争斗,并且无法成功地让xsd.exe从我的机器上的命令行中的dll中的类生成模式。

最终我启动了一个Windows XP VM来运行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。有点奇怪的解决方法,但如果你还没有一个方便的话,那就比启动虚拟机容易得多。

基于我在网上找到的帮助信息不足,我猜不是每个人都有这个问题。

答案 1 :(得分:2)

我想扩展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作为您自己的测试应用程序的一部分运行,并在致电AppDomain.CurrentDomain.FirstChanceException之前注册XsdTool.Xsd

答案 2 :(得分:1)

不要将dll复制到其他位置,而是从构建的输出文件夹中运行xsd.exe。

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

答案 3 :(得分:0)

对于我自己来说,最后的答案非常简单:我在相同的文件夹中缺少依赖程序集。 xsd.exe必须能够加载所有依赖类等,以便构建XSD。

作为测试以查看您的情况是否是这种情况,您可以在Visual Studio(或选择的IDE)中创建一个新项目,并引用您为其生成XSD的类的程序集。请务必参考xsd.exe正在使用的特定库文件。如果您新创建的项目可以使用它并查看该类,那么依赖关系是好的,您至少可以排除它。

答案 4 :(得分:0)

这是一个很晚的答案,但是也许可以帮助遇到相同问题的人。

如果xsd.exe因现有项目的类型加载异常而失败(作为解决方案的一部分),则可以运行调试会话,而无需编写任何代码来捕获和检查异常。

以这种方式配置调试会话:在项目的 Project Properties 中,在 Debug 页面上,选择启动外部程序

输入xsd.exe的完整路径,例如:

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools\x64\xsd.exe

开始选项中,指定必需的命令行参数

YourAssembly.dll /t:Your.Type

转到例外设置(调试-> Windows->例外设置),然后激活System.Reflection.ReflectionTypeLoadException例外。您确实可以根据需要激活所有CLR异常。

现在,按 F5 开始调试会话。

应出现XSD控制台窗口。然后,Visual Studio应该中断该过程,并显示抛出异常弹出窗口。在这里,您可以检查类型加载异常。

您还应该在 Locals 窗口中看到异常。

实际上,这也适用于任何程序集,您只需要一个解决方案和一个项目即可为其启动调试会话。这甚至可能是一个空的解决方案/项目。