我有一个自定义任务,我想在构建我的C#项目时执行.此任务位于MyTask.dll中,它引用另一个程序集MyCommon.DLL.
问题是MyCommon.dll位于相对于MyTask.dll的"..\Common\MyCommon.dll",它将它放在AppBase目录之外,用于MSBuild进程.我已经通过分析MSBuild的日志并看到Fusion关于绑定失败的报告确认这确实是问题.
如何在构建过程中使Fusion找到MyCommon.dll?请注意,移动程序集会破坏我的应用程序,这也取决于它.
更新:嗯,似乎我会继续使用复制品.其他解决方案都需要系统范围的修改,这在这里并不是真正的保证.
我的.NET可执行文件abc.exe引用了几个程 其中一个被称为xyz.core.exe.当从通过共享名称指定的网络位置启动它时,我无法使其工作\\localhost\xyz\abc.exe.如果我挂载名为Z:on 的网络驱动器号\\localhost\xyz并且如果我启动,这可以正常工作Z:\abc.exe.
尝试xyz.core.exe从共享加载程序集时,.NET似乎变得混乱.它会引发System.IO.FileNotFoundException以下融合日志信息的异常:
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable \\localhost\xyz\abc.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = Workstation\arnaud
LOG: DisplayName = xyz.core, Version=2.5.2.1001, Culture=neutral, PublicKeyToken=...
(Fully-specified)
LOG: Appbase = file://localhost/xyz/
LOG: Initial PrivatePath = NULL
Calling assembly : abc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...
===
LOG: This bind starts in default load context.
LOG: No application …Run Code Online (Sandbox Code Playgroud) 在我的Web应用程序中,我使用的是NHibernate.dll.这依赖于下面的程序集.
'Antlr3.Runtime,Version = 3.1.0.39271,Culture = neutral,PublicKeyToken = 3a9cab8f8d22bfb7'
现在在另一个需求的同一项目中,我必须介绍Antlr3.StringTemplate.dll.哪个依赖于上面程序集的另一个版本.
如果我使用满足NHibernate的Antlr3.Runtime.dll版本,Antlr3.StringTemplate会开始抱怨,反之亦然.
如何解决这样的情况?
我知道可以使用Prism或MEF框架动态加载xap模块.但是,我不想使用这些框架; 而是手动加载我的xap文件.所以,我创建了以下类(改编自互联网):
public class XapLoader
{
public event XapLoadedEventHandler Completed;
private string _xapName;
public XapLoader(string xapName)
{
if (string.IsNullOrWhiteSpace(xapName))
throw new ArgumentException("Invalid module name!");
else
_xapName = xapName;
}
public void Begin()
{
Uri uri = new Uri(_xapName, UriKind.Relative);
if (uri != null)
{
WebClient wc = new WebClient();
wc.OpenReadCompleted += onXapLoadingResponse;
wc.OpenReadAsync(uri);
}
}
private void onXapLoadingResponse(object sender, OpenReadCompletedEventArgs e)
{
if ((e.Error == null) && (e.Cancelled == false))
initXap(e.Result);
if (Completed != null)
{
XapLoadedEventArgs args = new …Run Code Online (Sandbox Code Playgroud) 我写了一个MsBuild任务:MyTask.在我的解决方案中,我有Task项目和其他项目.MyTask引用了一个引用第三个程序集的项目(比如ProjA),比如说(dep1和dep2).
这些项目都构建良好,我将输出放在一个目录(Compil)中.在这个目录中我有我想要的所有dll:MyTask.dll,ProjA.dll,dep1.dll,dep2.dll等.
在我的MsBuild文件中,我包含自定义任务程序集:
<UsingTask AssemblyFile="..\Compil\MyTask.dll" TaskName="CreateSitesCss" />
Run Code Online (Sandbox Code Playgroud)
然后我调用MyTask程序集的任务.该调用执行得很好但是MsBuild抱怨没有找到dep1和dep2程序集(尽管它们位于同一目录中):
错误:无法加载文件或程序集'dep1,Version = 2.0.0.0,Culture = neutral,PublicKey Token = 9109c11469ae1bc7'或其依赖项之一.该系统找不到指定的文件.
我可以通过将dep1.dll和dep2.dll复制到c:\ windows\microsoft .net\framework\v4.0 \来解决这个问题,但我不想这样做,因为它在构建其他项目时会触发问题(赢了' t将dep1.dll和dep2.dll复制到输出目录...).
有没有人有同样的问题,或更好的解决方案?
编辑
这是Fusion Log Viewer的输出
*** Assembly Binder Log Entry (19/10/2010 @ 17:52:45) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = HEADOFFICE\bbaumann
LOG: DisplayName = ProjA
(Partial)
WRN: …Run Code Online (Sandbox Code Playgroud) msbuild dependencies msbuild-task assembly-resolution probing
为这个狡猾的问题道歉 - 如果有人有更好的建议,我很乐意改写.
我正在尝试通过动态调用属于另一个应用程序的程序集来创建一个对象.
以下PowerShell代码对我很有用:
[Reflection.Assembly]::LoadFrom("C:\Program Files\Vendor\Product\ProductAPI.dll")
$bobject = new-object ProductAPI.BasicObject
$bobject.AddName("Some Name")
Run Code Online (Sandbox Code Playgroud)
我在C#中努力做同样的事情.根据StackOverflow上的其他帖子,我目前有这个:
System.Reflection.Assembly myDllAssembly =
System.Reflection.Assembly.LoadFile("C:\\Program Files\\Vendor\\Product\\ProductAPI.dll");
System.Type BasicObjectType = myDllAssembly.GetType("ProductAPI.BasicObject");
var basicObjectInstance = Activator.CreateInstance(BasicObjectType);
Run Code Online (Sandbox Code Playgroud)
最后一行导致TargetInvocationException.
{"无法加载文件或程序集'AnotherObject,Version = 1.2.345.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一.系统找不到指定的文件."
看起来BasicObject构造函数试图调用AnotherObject(来自同一文件夹中的AnotherObject.dll)但找不到它.
关于如何解决这个问题的任何提示?
我在尝试从内存而不是从磁盘加载.NET程序集时遇到了一个令人困惑的问题.如果我编译程序集然后从磁盘加载它(使用LoadFile或LoadFrom),那么应用程序工作正常.
但是,如果我将已编译的程序集DLL文件作为嵌入式资源包含在项目中,然后使用Assembly.Load从资源流加载字节,那么随着应用程序继续运行,我会收到一系列随机错误.
这只是应用程序中八个程序集之一的问题 - 所有其他程序在磁盘或内存中都能正常工作.
谢谢您的帮助!
在我的应用程序中,我想将DLL文件放在一个子目录中.我正在使用probingapp.config中的元素,它工作得很好,但我遇到了本地化程序集的问题.
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="libs"/>
</assemblyBinding>
Run Code Online (Sandbox Code Playgroud)
如果我有两个DLL:
libs/de/myAssembly.dll
Run Code Online (Sandbox Code Playgroud)
和
libs/myAssembly.dll
Run Code Online (Sandbox Code Playgroud)
第一个是加载的,而我想要根文件夹中的文件是首选.我怎样才能做到这一点?
我有一个 C# 解决方案,它在编译时吐出一个可执行的二进制文件。二进制文件依赖于一个库,它是我编写的另一个解决方案的产物,所有相关代码都是我创建的。
最近,我以一种相当随意的方式尝试了许多项目设置,试图了解 CLR 构建链接的工作原理。不幸的是(可预见的?)我设法打破了我的二进制文件的链接,但我不知道如何解决这个问题。
正在加载程序集........无法在程序集 MY.Library 中添加类型,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null - 无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息
>
All probing URLs attempted and failed
*** Assembly Binder Log Entry (22/04/2011 @ 10:34:17) ***
The operation failed. Bind result: hr
= 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Running under executable G:\SVN\dev\Debug\MYExecutable.exe
--- A detailed error log follows.
=== Pre-bind state information === LOG: User = UBERIT\gavina LOG: DisplayName …Run Code Online (Sandbox Code Playgroud) 对于我正在现代化的项目,我有一套由应用程序的原始开发人员提供的单元测试。在我的现代化改造早期,它们是完全绿色运行的。然而,它们已经变成红色,但大多数情况下都有相同的例外:
例外:
System.IO.FileLoadException: Could not load file or assembly 'MyApp.BusinessLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Access is denied.
at MyApp.SomeExecutable.SomeClass.SomeMethod(args)
at MyApp.UnitTests.SomeExecutableFixture.CanValidateSomething() in [place of invocation of SomeClass.SomeMethod]
Run Code Online (Sandbox Code Playgroud)
异常没有内部异常。
从我所看到的,这发生在任何引用MyApp.BusinessLayer程序集中定义的东西的方法中,友好的错误消息通知我无法加载......显然是由于拒绝访问。
我尝试了以下方法来访问程序集:
fuslogvw.exe,并在运行时运行测试以了解绑定过程。没有信息出现;就好像在 Visual Studio 2015 中运行测试对 Fusion Log Viewer 完全不可见!即使在重新启动后,Fusion Log Viewer 也没有关于正在发生的程序集绑定的信息。(感谢@AndrewAu、@CodeCaster)c# ×5
.net ×3
fusion ×2
msbuild ×2
asp.net ×1
assemblies ×1
dependencies ×1
dll ×1
load ×1
msbuild-task ×1
networking ×1
nhibernate ×1
powershell ×1
probing ×1
reflection ×1
silverlight ×1
task ×1
unit-testing ×1
xap ×1