【问题标题】:How do I stop my class library generating an .EXE file and causing a TypeLoadException Exception?如何停止我的类库生成 .EXE 文件并导致 TypeLoadException 异常?
【发布时间】:2012-10-25 13:21:42
【问题描述】:
我的解决方案中出现了一个非常奇怪的错误,我的一个项目是一个类库,导致引用它的项目抛出 TypeLoadException。我浏览了关于 SO 的各种答案,最接近我的问题的是;
TypeLoadException was unhandled in C# [closed]
这个答案让我怀疑这是否是我的问题,在调试文件夹中进行了一些挖掘,我发现引用我的类库的项目正在生成同名的 DLL 和 EXE,这可能是我的问题吗?
如果是这样,我该如何解决这个问题?我的解决方案中有其他类库也在此项目中被引用,它们不会同时生成 DLL 和 EXE 文件。
【问题讨论】:
标签:
c#
dll
exe
class-library
typeloadexception
【解决方案1】:
我不相信,但实际上我已经通过一位同事找到了原因,希望这会帮助遇到此问题的其他人(好一个亚当)。
原因是我的项目引用我的类库具有相同的程序集名称,我一直在对我的命名空间进行一些重新调整并且没有注意到我的主项目具有相同的名称,这意味着当我的代码是编译器为我的主项目创建了一个 EXE,为我的类库创建了一个 DLL,这反过来又强制了 TypeLoadException,因为编译器已经加载了同名的 EXE。
我的代码现在可以工作了。感谢所有花时间发帖的人。
【解决方案2】:
我的类库正在生成同名的 DLL 和 EXE
是的,这导致了这个问题。您可以通过运行 Fuslogvw.exe 并记录所有绑定来轻松查看它。这是 Fusion 的一个有点奇怪的怪癖,但是当它查找程序集时,它只查看文件名并忽略扩展名。它将接受 .dll 和 .exe 作为它正在寻找的程序集的可接受匹配。这在其他方面有点合乎逻辑,当 DLL 和 EXE 包含托管代码时,它们之间没有真正的区别。例如,完全支持引用 EXE。
没有办法强制加载程序以不同的方式执行此操作。解决方法应该很简单,只要确保生成不同的程序集名称即可。
【讨论】:
-
是的,通过我的同事和attached answer(由于某种原因已关闭)我解决了这个问题,只是 EXE 和 DLL 的程序集名称相同的事实一开始就让我感到震惊。
【解决方案3】:
在项目 -> (YourProjectName) 属性 -> 应用程序下,确保“输出类型”设置为“类库”。
【讨论】:
-
感谢回复我已经找到原因并发布了answer,但是为了完整起见,我的项目设置为“类库”。