标签: assembly-resolution

如何解决:自定义MSBuild任务需要在AppBase之外进行组装

我有一个自定义任务,我想在构建我的C#项目时执行.此任务位于MyTask.dll中,它引用另一个程序集MyCommon.DLL.

问题是MyCommon.dll位于相对于MyTask.dll的"..\Common\MyCommon.dll",它将它放在AppBase目录之外,用于MSBuild进程.我已经通过分析MSBuild的日志并看到Fusion关于绑定失败的报告确认这确实是问题.

如何在构建过程中使Fusion找到MyCommon.dll?请注意,移动程序集会破坏我的应用程序,这也取决于它.

更新:嗯,似乎我会继续使用复制品.其他解决方案都需要系统范围的修改,这在这里并不是真正的保证.

msbuild fusion task assembly-resolution

6
推荐指数
1
解决办法
3771
查看次数

从\\ localhost\xyz启动时,.NET可执行文件不会加载引用的程序集

我的.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)

c# networking load fusion assembly-resolution

6
推荐指数
1
解决办法
2999
查看次数

如何解决.Net中冲突的程序集?

在我的Web应用程序中,我使用的是NHibernate.dll.这依赖于下面的程序集.

'Antlr3.Runtime,Version = 3.1.0.39271,Culture = neutral,PublicKeyToken = 3a9cab8f8d22bfb7'

现在在另一个需求的同一项目中,我必须介绍Antlr3.StringTemplate.dll.哪个依赖于上面程序集的另一个版本.

如果我使用满足NHibernateAntlr3.Runtime.dll版本,Antlr3.StringTemplate会开始抱怨,反之亦然.

如何解决这样的情况?

.net asp.net nhibernate assemblies assembly-resolution

6
推荐指数
1
解决办法
2162
查看次数

silverlight 4,动态加载xap模块

我知道可以使用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)

silverlight assembly-resolution xap

6
推荐指数
1
解决办法
5080
查看次数

MsBuild没有查找自定义任务的第二级依赖项的良好目录

我写了一个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

6
推荐指数
1
解决办法
1564
查看次数

如何动态引用查找另一个程序集的程序集?

为这个狡猾的问题道歉 - 如果有人有更好的建议,我很乐意改写.

我正在尝试通过动态调用属于另一个应用程序的程序集来创建一个对象.

以下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)但找不到它.

关于如何解决这个问题的任何提示?

c# reflection powershell assembly-resolution

6
推荐指数
1
解决办法
1759
查看次数

从内存而不是磁盘加载.NET程序集

我在尝试从内存而不是从磁盘加载.NET程序集时遇到了一个令人困惑的问题.如果我编译程序集然后从磁盘加载它(使用LoadFile或LoadFrom),那么应用程序工作正常.

但是,如果我将已编译的程序集DLL文件作为嵌入式资源包含在项目中,然后使用Assembly.Load从资源流加载字节,那么随着应用程序继续运行,我会收到一系列随机错误.

这只是应用程序中八个程序集之一的问题 - 所有其他程序在磁盘或内存中都能正常工作.

谢谢您的帮助!

.net c# assembly-resolution .net-assembly

6
推荐指数
1
解决办法
9374
查看次数

探测privatePath和子目录

在我的应用程序中,我想将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)

第一个是加载的,而我想要根文件夹中的文件是首选.我怎样才能做到这一点?

.net assembly-resolution

6
推荐指数
1
解决办法
1万
查看次数

C# - 'Resources' DLL 无法加载,因为它不存在 - 我如何找到引用以便我可以删除它?

我有一个 C# 解决方案,它在编译时吐出一个可执行的二进制文件。二进制文件依赖于一个库,它是我编写的另一个解决方案的产物,所有相关代码都是我创建的。

最近,我以一种相当随意的方式尝试了许多项目设置,试图了解 CLR 构建链接的工作原理。不幸的是(可预见的?)我设法打破了我的二进制文件的链接,但我不知道如何解决这个问题。

  • 当我使用二进制文件时,我会在应用程序崩溃之前收到以下反馈

正在加载程序集........无法在程序集 MY.Library 中添加类型,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null - 无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息

  • MY.Library.resources DLL 的融合日志如下。提到的二进制文件不存在,我不知道它在哪里或为什么要加载。

>

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)

c# dll assembly-resolution

5
推荐指数
1
解决办法
8273
查看次数

在单元测试中调试 System.IO.FileLoadException

对于我正在现代化的项目,我有一套由应用程序的原始开发人员提供的单元测试。在我的现代化改造早期,它们是完全绿色运行的。然而,它们已经变成红色,但大多数情况下都有相同的例外:

例外:

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程序集中定义的东西的方法中,友好的错误消息通知我无法加载......显然是由于拒绝访问。

我尝试了以下方法来访问程序集:

  1. 在 Windows 资源管理器中导航到程序集,并授予自己完全访问权限。没有效果。
  2. 导航到 Windows 资源管理器中的包含文件夹并授予我完全访问权限。还是没有效果。
  3. 以管理员身份运行 VS 2015,并重新运行单元测试。没有效果。
  4. 我认为情况很疯狂,所以我检查了 VS 项目中的引用,但它们都指向我应该测试的程序集(它与 UnitTest 程序集位于同一文件夹中。)不可能是这样.
  5. 尝试运行fuslogvw.exe,并在运行时运行测试以了解绑定过程。没有信息出现;就好像在 Visual Studio 2015 中运行测试对 Fusion Log Viewer 完全不可见!即使在重新启动后,Fusion Log Viewer 也没有关于正在发生的程序集绑定的信息。(感谢@AndrewAu、@CodeCaster)
  6. 在建议使用进程监视器实用程序后,发现发生了一些模拟。我授予了 SomeDomain\SomeUser 对被测文件夹的权限;没有效果。(感谢@DarinDimitrov)
  7. 回顾基础知识,确保所有被测程序集都是相同的 .NET 版本 - 特别是 .NET 4.6。他们是; 那不可能(感谢@Kamo)
  8. 与同事商量后,我想起我们刚刚换了笔记本电脑。我尝试在我的旧笔记本电脑上加载代码,它以前在那里工作过。在那里仍然不起作用。
  9. 虽然不是最佳实践,但出于绝望,一位同事建议直接引用业务层 DLL,而不是通过业务层的 C# 项目。这也没有影响(不过,我恢复了项目参考。) …

c# unit-testing assembly-resolution

5
推荐指数
0
解决办法
1347
查看次数