我想从使用xsd.exe的程序集生成某种类型的模式 这是命令行:
xsd.exe TestAssemby.dll /t:TestType
这是我得到的错误:
错误:处理'TestAssemby.dll'时出错。 无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息
我将引用的dll复制到根据this找到的文件夹中。
但仍然会出现同样的错误
我有疑问:
答案 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。
答案 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 窗口中看到异常。
实际上,这也适用于任何程序集,您只需要一个解决方案和一个项目即可为其启动调试会话。这甚至可能是一个空的解决方案/项目。