我正在查看msdn文档,我仍然对使用LoadFile和LoadFrom加载程序集之间的区别究竟有点困惑.有人可以提供一个例子或类比来更好地描述它.MSDN文档让我更加困惑.此外,它是ReflectionOnlyLoadFrom相同的,LoadFrom只是它只在反射模式下加载程序集.
由于我的.NET经验并不是最好的,因此以下是有关使用LoadFile的MSDN文档的一些问题:
1)LoadFile检查具有相同标识但位于不同路径的程序集是什么意思?身份是什么(例子)?
2)它声明LoadFile不会将文件加载到"LoadFrom上下文"中,并且不会使用加载路径解析依赖关系.这是什么意思,有人可以提供一个例子吗?
3)最后,它声明LoadFile在这种有限的场景中很有用,因为LoadFrom无法加载具有相同身份但路径不同的程序集; 它只会加载第一个这样的组件,这再次带给我同样的问题,组件标识是什么?
我正在尝试升级Unity到版本(2.1.505.2),但是当我运行应用程序时,我得到以下内容FileLoadException
无法加载文件或程序集"Microsoft.Practices.Unity,Version = 2.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.
我们正在从Unity 2.0.414.0升级到2.1.505.2.
gacutil -l)我从存档中删除了所有Unity dll.用powershell双重检查
PS C:\> ls -rec -inc Microsoft.Practices.Unity.dll | foreach-object { "{0}`t{1}" -f $_.FullName, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
Run Code Online (Sandbox Code Playgroud)如何找出仍然引用Unity 2.0.414.0的内容?
FusionLogVw没有告诉我哪个DLL导致了这个问题.
任何帮助深表感谢!
假设系统安装了.NET 4.0和.NET 4.5.
是否可以从针对.NET 4.0编写的程序集中加载和使用.NET 4.5程序集?
简单地说,我可以从.NET 4.0代码调用Assembly.Load来加载.NET 4.5目标程序集吗?
我在mvc3 Web应用程序中使用Magick.net库,这些都是我做的步骤
我的项目是针对AnyCPU,我的机器是64位
将Magick.NET-x64.dll的参考添加到项目中.从此处为Visual Studio 2012 Update 4安装了Visual C++ Redistributable http://www.microsoft.com/en-us/download/details.aspx?id=30679
在计算机上安装了Ghostscript 9.14 for Windows(64位)
<add assembly="Magick.NET-x64, Version=7.0.0.0002, Culture=neutral, PublicKeyToken=2004825badfa91ec" />
Run Code Online (Sandbox Code Playgroud)
在web.config文件上
项目成功重建[并且所有dll也在bin文件夹中],但在运行时我得到例外
无法加载文件或程序集"Magick.NET-x64"或其依赖项之一.尝试加载格式不正确的程序.
描述:执行当前Web请求期间发生未处理的异常.有关错误及其在代码中的起源,请查看堆栈跟踪以获取更多信息.
异常详细信息: System.BadImageFormatException:无法加载文件或程序集"Magick.NET-x64"或其依赖项之一.尝试加载具有不正确格式的程序.
源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关>异常的来源和位置的信息.程序集加载跟踪:以下信息有助于确定无法加载程序集"Magick.NET-x64"的原因.
Run Code Online (Sandbox Code Playgroud)=== Pre-bind state information === LOG: DisplayName = Magick.NET-x64 (Partial) WRN: Partial binding information was supplied for an assembly: WRN: Assembly Name: Magick.NET-x64 | Domain ID: 6 WRN: A partial bind occurs when only part of the assembly display name is provided. WRN: This might result in the …
我正在使用.Net dll Newtonsoft.Json in my C# TBB来处理组件并生成Json数据.我已经添加了这个dll GAC[Global Assembly Cache],它也可以运行.但有时它不起作用,我发布时出现以下错误:
JScriptException: Expression 'RenderComponentPresentation()' had error 'Could not load file or assembly 'Newtonsoft.Json, Version=4.0.5.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified.'
但是当我在Tridion中预览页面时它运行正常.要解决此问题,我们重新启动Tridion Services,重新启动后,我们发布了一个很好的页面.但是这个问题一再出现.有没有办法永久解决这个问题?
最近,当我已经在发布过程中再次发布同一页面时,我可以重现问题.第二次发布尝试返回上述错误,但第二次发布尝试失败后第一次发布尝试完成并返回Success.任何想法为什么这种奇怪的行为.
我正在尝试在我的项目中创建一个在插件.dll中实现的类的实例来进行类型发现.我收到这个例外:
无法从程序集'SquidReports.DataCollector.Plugin.BES,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'Action'.
这是我正在使用的确切方法签名:https: //msdn.microsoft.com/en-us/library/d133hta4(v = vs.110).aspx
换句话说,我试图根据程序集名称和类名生成对象,如下所示:
object modelObject = Activator.CreateInstance((string)modelInfo.AssemblyName, (string)modelInfo.ModelName);
Run Code Online (Sandbox Code Playgroud)
这里要注意的一个重要部分是我使用程序集的"短"名称而不是"完整"名称(包括Version,Culture和PublicToken).但是,MSDN明确指出:
'assemblyName'可以是以下任何一种:程序集的简单名称,没有其路径或文件扩展名.
例如,您可以为其路径和名称为.\ bin\TypeExtensions.dll的程序集指定TypeExtensions.
已签名程序集的全名,包括其简单名称,版本,区域性和公钥令牌; 例如,"TypeExtensions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 181869f2f7435b51".
具体来说,我正在尝试创建一个在程序集'SquidReports.DataCollector.Plugin.BES'中定义的类'Action'的实例.我明确地将此程序集引用为完全相同*.cs文件顶部的using指令,我正在尝试创建该实例.
我从之前的问题/答案中尝试了以下建议:
清理你的解决方案,重建并再试一次这似乎适用于一些ASP.NET项目,但这是一个简单的旧控制台应用程序.
检查配置文件中引用的程序集同样,这是一个简单的控制台应用程序,仅在同一解决方案的不同项目中使用GAC和库
1.确保程序集位于正确的工作目录中:
我们到了...

2.确保程序集是磁盘上的相同版本
对...

3.最后的建议是使用fuslogvw.exe.
我没有使用该工具的经验,但有一件事我确实发现奇怪.在运行调试会话时,我的程序集的长命名和短命名版本都出现了:

我看了看两个日志.
这个命名短的版本确实会产生一些警告:
===预绑定状态信息===
LOG:DisplayName = SquidReports.DataCollector.Plugin.BES Partial)WRN:为程序集提供了部分绑定信息:
警告:程序集名称:SquidReports.DataCollector.Plugin.BES | 域ID:1
警告:仅提供部分程序集显示名称时发生部分绑定.
警告:这可能导致装订器装入错误的装配.
警告:建议为程序集提供完全指定的文本标识,
警告:它由简单的名称,版本,文化和公钥令牌组成.
警告:有关此问题的更多信息和常见解决方案,请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270.
...但它以成功加载结束,它清楚地提到我的装配在正确的位置:
日志:尝试下载新的URL文件:/// C:/Source/C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL.
长命名版本的日志不包含可疑消息.
还有什么想法吗?
编辑:这是Action类的最小定义.它纯粹是一个模型类.
public class Action : ICollectible
{
public Action()
{
// Empty constructor …Run Code Online (Sandbox Code Playgroud) 我已经克服了一个令人生畏的难题.这是我的情况:
我正在使用插件框架构建应用程序.有一个基本插件类,所有插件都必须扩展.在同一个程序集中,我有一个帮助程序类,它将序列化和反序列化类.它是一个通用类,它遍布各处.结构是这样的:
MyApp.dll
|_ App.cs
|_ HelperCollection.cs
|_ PluginBase.cs
MyPlugin.dll
|_MyPlugin.cs (this extends PluginBase)
|_Foo.cs
Run Code Online (Sandbox Code Playgroud)
我的问题是程序集加载和锁定文件.该应用程序的一个要求是可以随时覆盖插件.如果是这样,他们需要重新加载.这似乎是加载程序集以使其不被锁定的最佳方式(也就是说,我可以在应用程序仍在运行时覆盖它或吹走)是这样的:
byte[] readAllBytes = File.ReadAllBytes("MyPlugin.dll");
Assembly assembly = Assembly.Load(readAllBytes);
Run Code Online (Sandbox Code Playgroud)
加载插件组件工作正常,没有问题.我从插件程序集中的MyPlugin.cs中得到一个例外,我试图使用它HelperCollection进行反序列化.一个例子可能是这样的:
// HelperCollection uses XmlSerializer under the covers
List<Foo> settingCollection = HelperCollection<Foo>.Deserialize("mysettings.xml");
Run Code Online (Sandbox Code Playgroud)
它正在爆炸并抛出一个InvalidCastException说法"Unable to cast object of type 'List[Foo]' to 'List[Foo]'".经过多次研究,我终于找到了原因.它被加载到LoadNeither绑定上下文中.
何时Foo加载(来自MyPlugin.dll)它位于LoadNeither绑定上下文中,而包含类型转换类型的程序集(在我的情况下,MyApp.dll)在Default上下文中加载.因此即使它们具有相同的名称,它们也不被认为是相同的类型.这是因为我正在使用它Assembly.Load(byte[]).
我怎么能绕过这个?我怎么能够,
对不起文本墙,只是想获得所有相关信息.
我正在使用一个Windows服务,其中我有一个程序集的引用,复制local = false.但是我试图在运行时加载它,虽然当我从visual studio运行它时工作正常但是当我尝试安装它时,cmd给出了这个错误:
An exception occurred while trying to find the installers in the D:\Official\Pro
jects\20131007_ImproveDN\build\debug\application
s\SubscriptionService\SubscriptionService.exe assembly.
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the
requested types. Retrieve the LoaderExceptions property for more information.
Aborting installation for D:\Official\Projects\2
0131007_ImproveDN\build\debug\applications\SubscriptionService\SubscriptionServi
ce.exe.
An exception occurred during the Rollback phase of the System.Configuration.Inst
all.AssemblyInstaller installer.
System.InvalidOperationException: Unable to get installer types in the D:\Offici
al\Projects\\20131007_ImproveDN\build\debug\appli
cations\SubscriptionService\SubscriptionService.exe assembly.
The inner exception System.Reflection.ReflectionTypeLoadException was thrown wit
h the following error message: Unable …Run Code Online (Sandbox Code Playgroud) I have an in-memory assembly MyAssembly (class library) that is used in my main assembly MyApp.exe:
byte[] assemblyData = GetAssemblyDataFromSomewhere();
Run Code Online (Sandbox Code Playgroud)
(For testing, the GetAssemblyDataFromSomewhere method can just do File.ReadAllBytes for an existing assembly file, but in my real app there is no file.)
MyAssembly has only .NET Framework references and has no dependencies to any other user code.
I can load this assembly into the current (default) AppDomain:
Assembly.Load(assemblyData);
// this works
var obj = Activator.CreateInstance("MyAssembly", "MyNamespace.MyType").Unwrap();
Run Code Online (Sandbox Code Playgroud)
Now, …
assembly-loading ×10
c# ×8
.net ×5
assemblies ×2
.net-4.0 ×1
.net-4.5 ×1
appdomain ×1
json.net ×1
magick.net ×1
plugins ×1
reflection ×1
tridion ×1
tridion2009 ×1