VSTS 2010 SGEN错误:无法加载文件或程序集(HRESULT异常:0x80131515)。

107
我在VS2010中遇到了一个奇怪的问题。我们使用TFS来构建API dll,并且过去我们会使用一个完全受信任的映射网络驱动器来引用它们。我们以这种方式工作至少两年,一切都很完美。

今天,我将一个webapp转换为vs2010并在Release模式下编译时,它报错:

SGEN:错误:无法加载文件或程序集“file:///L:\Api\Release API_20100521.1\Release\CS.API.Exceptions.dll”之一,操作不受支持。(来自HRESULT的异常:0x80131515)

奇怪的是,当它处于Debug模式下时,它是正常的...

我尝试添加了

<runtime>
   <loadFromRemoteSources enabled="true" />
</runtime>

我尝试将代码放入app.config中,但仍然没有成功(参见http://social.msdn.microsoft.com/Forums/en/msbuild/thread/d12f6301-85bf-4b9e-8e34-a06398a60df0http://msdn.microsoft.com/en-us/library/dd409252(VS.100).aspx)。

我相信这个问题是由Visual Studio或MSBuild引起的,因为当我们的代码在生产环境下从网络共享运行时,所有引用的dll都会被复制到bin文件夹中。

如果有人有解决方案(或者只是一个搜索路径的想法),请告诉我!

编辑:事实证明,它在Debug模式下工作是因为序列化程序集的生成被关闭了。正如标题所说,这确实是一个SGEN问题,因为正是这个实用程序说路径不可信...

13个回答

217
我成功解决了这个错误,方法是在Windows资源管理器中找到相关的程序集DLL文件,右键点击,选择“属性”,然后按下“解除锁定”按钮。DLL文件包含一个标记它为外部文件的流,通过点击解除锁定按钮,您可以删除此标记。

2
我曾经遇到过从zip文件中复制DLL的问题。 - 79IT
我今天刚遇到了这个问题,解除所有相关的DLL文件的阻止就像魔法一样奏效。 - Seiyria
我遇到的问题正是这个。 - Sean
@Jonas Stawski,这是因为它要么没有解决开发者的问题,要么他们没有尝试过并且无法确认。仅仅因为它对其他遇到类似问题的人有效,并不意味着它是 OP 的正确解决方案。根据他的编辑,下面的答案应该被接受。 - akousmata
今天解决方案中的解除阻塞对我起了作用。这个问题只出现在发布版本中,调试版本没有问题。而且,我已经将该项目构建成几十个发布版本,没有遇到过这个问题。今天与昨天有关对有问题的dll引用有什么不同呢?我不知道。 - hermes the goat
显示剩余5条评论

60
我在一个TFS构建服务器上遇到了类似的问题,构建引用了来自网络共享的dll文件。
问题在于CLR v4安全策略模型与之前的版本不同,不再像以前那样对程序集进行沙盒隔离。
要解决这个问题,只需找到sgen.exe的位置,并在同一文件夹中创建一个sgen.exe.config文件,内容如下:
<configuration>
  <runtime>
    <loadFromRemoteSources enabled="true" />
  </runtime>
</configuration>

sgen.exe通常位于
"C:\Program Files\Microsoft SDKs\Windows\v[current version]\bin\NETFX 4.0 Tools"

你可以在这篇博客文章中了解一些关于.NET 4.0中CAS政策的变化:链接

1
是的,我遇到了这个解决方案,但对我没有用,我什么也没改...我们把序列化程序集关闭后解决了。 - Developer IT
7
其他人的信息,SGEN通常位于“C:\ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ NETFX 4.0 Tools” - Steve Cooper
1
请注意,如果是64位机器,则需要在...\Bin\NETFX 4.0 Tools\x64\下创建。 - Vivek Ayer
我的安装程序在...\bin\和...\bin\NETFX 4.0工具中都有sgen.exe,而后者是需要配置文件的那个。这让我有点困惑。 - Joshua P. Swanson
1
对于VS2015,请将其定位在:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools。 - Farshid
显示剩余5条评论

26

我遇到了同样的问题,但配置更改没有起作用。只有在项目属性中将“生成序列化程序集”设置为关闭时,才能解决问题。


对我也起作用了。根据问题中他的编辑评论,这也是OP的正确答案。 - akousmata
对我有用。谢谢。 - Vinicius Gonçalves
3
项目属性 -> 生成 -> 生成序列化程序集为自动,将其设置为关闭后,编译开始正常工作。+1 谢谢。 - Honza P.
这在我的情况下也起作用了。不管怎样,我想知道关闭它到底意味着什么,因为默认情况下它对发布配置是开启的:我想确保在将应用程序发布到生产环境时它不会产生任何副作用。 - Asimov
只有一个项目出现了这个问题 - 将其从“自动”更改为“关闭” - 这个项目正在引用 SOAP WS。 - Subha

6

3

我曾经遇到过同样的问题,并通过在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools目录下添加sgen.exe.config文件来解决它。

像其他人所说的那样,只需使用这个简单的配置文件即可。

<?xml version ="1.0"?>
<configuration>
  <runtime>
    <loadFromRemoteSources enabled="true" />
  </runtime>
</configuration>

2

如果您正在运行64位版本的TFS构建服务,我必须在以下路径创建配置文件:

 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\x64

并且文件的内容为:

<?xml version ="1.0"?>
<configuration>
<runtime>
    <loadFromRemoteSources enabled="true" />
</runtime>
</configuration>

1
在我的情况下,将下面的代码片段添加到app.config文件中起作用了。我使用的是Windows XP操作系统以及VS2010 SP1版本。
<configuration>
  <runtime>
    <loadFromRemoteSources enabled="true" />
  </runtime>
</configuration>

1

万一像我一样,解除封锁不是一个解决方案,因为在我的dll文件属性中看不到解除封锁选项。继续寻找并最终关闭我的解决方案文件,然后使用本地C:副本而不是网络UNC路径到项目sln文件重新打开。在采用这种方法后能够成功发布。


1

我曾经遇到过同样的问题,将程序集加载到全局程序集缓存中后问题得到解决。


问题是我们不想要那些在GAC中的程序集。我们解决了将序列化程序集关闭的问题。 - Developer IT

1
在我的情况下,一堆dll文件被阻止了。
为了解除文件夹中的所有文件的阻止,我使用了以下命令的PowerShell。
dir -Path [directory path] -Recurse | Unblock-File

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接