标签: assembly-resolution

在运行时动态加载程序集依赖项的问题

让我试着解释我的问题.我目前正在尝试开发一个用.Net编写的小型"插件框架"(主要用于实验).因此,我们的想法是通过在主应用程序的特定文件夹"插件"中部署dll来创建一个可以添加"插件"的主应用程序.一切正常,插件正确实例化,但现在我遇到了问题.我现在部署了一个使用其他第三方插件的插件"X",所以现在我遇到的问题是在运行时找不到"X"所需的这些额外的第三方插件.因此,我的想法是现在添加一个额外的目录"dependencies",我还部署了所有需要的插件.

所以我的第一个问题是:如何将程序集加载到应用程序域中(假设我知道它们的路径),我的应用程序可以使用它们吗?

我尝试通过做类似的事情来解决这个问题:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    //find the path to the assembly and then load and return it by
    //return Assembly.Load("pathToDependencies/failedAssembly.dll");
}
Run Code Online (Sandbox Code Playgroud)

问题是这个事件处理程序现在被激活,在args变量中有"Presentation.Zune.dll"(我正在使用WPF应用程序).好像那个程序集加载失败但实际问题是另一个dll.

有人可以建议我更好的方法来解决我的问题吗?我希望我能够充分解释我的情况,否则只是要求进一步澄清.

谢谢,Juri

.net reflection assembly-resolution

4
推荐指数
1
解决办法
4690
查看次数

在fuslogvw中Default/NativeImage是什么意思?

我偶尔使用fuslogvw来追踪加载程序集的问题.在我使用它的所有时间之后,似乎文件夹'NativeImage'具有加载我的dll的原生图像的结果.当找不到本机图像时(通常不是),我认为它会查找.net程序集.'default'文件夹是我通常关心的,因为它有所有程序集绑定的日志,这是我的问题通常所在.

任何人都能解释这里真正的区别吗?

.net assembly-resolution

4
推荐指数
1
解决办法
2007
查看次数

AssemblyName.ReferenceMatchesDefinition 如何工作?

给出以下代码:

  var n1 = new AssemblyName ("TestDll, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089");
  var n2 = new AssemblyName ("TestDll, Version=2.0.0.2001, Culture=en-US, PublicKeyToken=ab7a5c561934e089");

  Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n1, n2));
  Console.WriteLine (AssemblyName.ReferenceMatchesDefinition (n2, n1));
Run Code Online (Sandbox Code Playgroud)

为什么这两个检查都打印“True”?我本以为 AssemblyName.ReferenceMatchesDefinition 应该考虑程序集名称的版本、区域性和公钥标记属性的差异,不是吗?

如果没有,ReferenceMatchesDefinition 能做什么而简单名称的比较却不能做什么?

c# reflection assembly-resolution assembly-name

4
推荐指数
1
解决办法
723
查看次数

如何将.NET 3.5和.NET 4.0程序集添加到FxCop代码分析?

我想分析一个解决方案,其中包含针对.NET 3.5 SP1的项目以及一些针对.NET 4的项目,这些项目依赖于.NET 3.5库.

当我尝试添加两个程序集时,一个用于.NET 3.5,另一个用于.NET 4,FxCop会抛出异常:

AssemblyLoadException
Conflicting target platforms
'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' vs
'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉FxCop只使用版本4.0.0.0?

.net fxcop .net-4.0 assembly-resolution .net-3.5

4
推荐指数
1
解决办法
2372
查看次数

DisallowApplicationBaseProbing = true时需要连接AssemblyResolve事件

设置DisallowApplicationBaseProbing = true时,我需要在创建的AppDomain上连接AssemblyResolve事件。我这样做的原因是强制运行时调用需要解析程序集的AssemblyResolve事件,而不是先进行探测。这样,另一个开发人员就不能仅将MyDllName.dll粘贴在ApplicationBase目录中,并覆盖我想在AssemblyResolve事件中加载的程序集。

这样做的问题如下:

  class Program
  {
 static void Main()
 {
    AppDomainSetup ads = new AppDomainSetup();
    ads.DisallowApplicationBaseProbing = true;
    AppDomain appDomain = AppDomain.CreateDomain("SomeDomain", null, ads);
    appDomain.AssemblyResolve += OnAssemblyResolve;
    appDomain.DoCallBack(target);
 }

 static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
 {
    Console.WriteLine("Hello");
    return null;

 }

 private static void target()
 {
    Console.WriteLine(AppDomain.CurrentDomain);
 }
  }
Run Code Online (Sandbox Code Playgroud)

代码永远不会超出+ = OnAssemblyResolve行。

当代码尝试执行时,新的应用程序域将尝试解析我正在其中执行的程序集。由于DisallowApplicationBaseProbing = true,因此不知道在哪里可以找到该程序集。看来我有鸡肉和鸡蛋问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。

感谢您提供的所有帮助。

-麦克风

c# assembly-resolution

4
推荐指数
1
解决办法
1998
查看次数

Microsoft.SqlServer.SqlTools.VSIntegration引用Visual Studio 2010中的问题/异常

SQL Server Edition:2008 Enterprise Visual Studio:2010 w/.NET 4.0

SSMS 2008 Addin - CodePlex上的Data Scripter项目源代码引用 Microsoft.SqlServer.SqlTools.VSIntegration.dll

我已经引用了DLL
<<Microsoft SQL Server install location>>\100\Tools\Binn\VSShell\Common7\IDE

但这是奇怪的.Microsoft.SqlServer.SqlTools.VSIntegration.dll包含一个命名空间Microsoft.SqlServer.Management.UI.VSIntegration,该命名空间又包含ServiceCache(公共密封).

一旦我添加引用,ServiceCache就会突出显示(这意味着没有引用问题)但是当我编译项目并且VS 2010引发一个无法找到ServiceCache的错误时会出现问题.

当前上下文中不存在名称"ServiceCache"

为什么ServiceCache在编译期间不可见但看起来在添加程序集后可用?

并且Reflector确实显示ServiceCache是​​项目引用的程序集的一部分,但Visual Studio intellisense无法显示它.

有没有这种问题?

[更新]一些截图

反射器清楚地显示 ServiceCache 替代文字

但Visual Studio 2010说,否则...... 替代文字

sql-server ssms assembly-resolution visual-studio

3
推荐指数
1
解决办法
3251
查看次数

将程序集加载到新的AppDomain以进行静态类/方法调用时出现问题

我通过C#执行.NET程序集时遇到了一些重大问题.我想从静态类调用静态方法(Main).我让它在当前域中工作,但显然我无法从那里卸载程序集.

首先,我尝试创建一个新的AppDomain:

AppDomain domain = AppDomain.CreateDomain("PluginDomain");
Run Code Online (Sandbox Code Playgroud)

由于我的主要问题是解析我正在尝试加载的程序集,我试图挂钩AssemblyResolve事件:

domain.AssemblyResolve += new ResolveEventHandler(this.OnAssemblyResolve);
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个关于序列化的错误(即这个类).

我已成功加载一个汇编文件,它恰好位于BaseDirectory中,只需使用:

domain.Load("Assembly1");
Run Code Online (Sandbox Code Playgroud)

但有问题的程序集位于BaseDirectory的两个子目录中,即.BaseDirectory\dir1\dir2\Assembly2.dll - 当使用带有字符串程序集名称的domain.Load()(将PrivateBinPath安装到正确的子目录位置)时以及使用带有程序集字节的domain.Load()时,我得到FileNotFoundException (来自File.ReadAllBytes()).

我知道AppDomain.Load()已被删除,但它似乎是唯一可用的方法,考虑到我不想强制包含静态方法的类是非静态和可实例化的.

无论如何,我该怎么做才能确保汇编文件正确加载到新的AppDomain中?

我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但必要时也必须完全卸载程序集.它的目的是成为一个插件系统.

.net c# appdomain assembly-resolution .net-assembly

2
推荐指数
1
解决办法
2743
查看次数

C#无法反序列化DataTable

我有一个客户端/服务器项目,我正在尝试通过套接字从服务器向客户端发送DataTable(从TableAdapter中提取).我的服务器命名空间是srvCentral,我的客户端是appClient.当我尝试在客户端反序列化DataTable时,它会抛出一个序列化异常,说无法找到程序集'srvCentral,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'我用谷歌搜索并尝试控制AssemblyResolve之类的东西,这使得svchost挂起并强迫我关闭,并使用这样的绑定器:

sealed class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type typeToDeserialize = null;

        String currentAssembly = Assembly.GetExecutingAssembly().FullName;

        // In this case we are always using the current assembly
        assemblyName = currentAssembly;

        // Get the type using the typeName and assemblyName
        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                                         typeName, assemblyName));

        return typeToDeserialize;
    }
}
Run Code Online (Sandbox Code Playgroud)

那里的例外情况仍然存在......是不是假设DataTable可以在任何地方进行反序列化?我究竟做错了什么?

我的序列化代码是:

public byte[] Serializar(Object item)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    formatter.Serialize(ms, …
Run Code Online (Sandbox Code Playgroud)

c# datatable assembly-resolution deserialization binary-deserialization

2
推荐指数
1
解决办法
2906
查看次数

在发布模式下构建时发生System.BadImageFormatException

我在一个DLL中引用了一个exe文件.在DEBUG模式下运行时,一切运行正常,但在Release模式下运行时,抛出异常

System.BadImageFormatException occurred
  HResult=-2147024885
  Message=Could not load file or assembly 'Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
  Source=Presensoft.ApplicationServer
  FileName=Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  FusionLog==== Pre-bind state information ===
LOG: DisplayName = Presensoft.InlineMarker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///F:/PresensoftNewTrunk/Trunk/Email Archiver/EmailService/Presensoft.ApplicationServerHost/bin/Release/
LOG: Initial PrivatePath = NULL
Calling assembly : Presensoft.ApplicationServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: …
Run Code Online (Sandbox Code Playgroud)

.net c# assembly-resolution

2
推荐指数
1
解决办法
3813
查看次数

.NET 引用的程序集何时放入 bin\debug 中的规则

.NET(或 Visual Studio)构建如何决定是否将引用的程序集复制到 bin/debug 或 bin/release 目录?(这是一个 .exe 控制台程序。)

在我的机器上,我在 GAC 中有引用的程序集。一位同事将我的 bin/release 复制到他们的计算机上,但它无法运行,因为引用的程序集不在 bin/release 中(并且不在他们的 GAC 上)。

谢谢,

尼尔·沃尔特斯

.net gac build assembly-resolution

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

尝试运行Fluent NHibernate教程示例时出现运行时错误

我在http://wiki.fluentnhibernate.org/Getting_started上完成了Fluent NHibernate教程,项目编译得很好.

但是,我收到运行时错误,我似乎无法解决它.您可以在教程中看到的CreateSessionFactory方法中发生错误.这里是:

private static ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure()
        .Database
        (
            SQLiteConfiguration.Standard
                .UsingFile(DbFile)
        )
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<FluentNHibernateSample.Program>())
        .ExposeConfiguration(BuildSchema)
        .BuildSessionFactory();

}
Run Code Online (Sandbox Code Playgroud)

我认为最有帮助的事情是给你从最外层异常到最内层异常的异常链(这是一个真正的单词):

An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
    An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
        Could not compile the mapping document: (XmlDocument)
            persistent class FluentNHibernateSample.Entities.Employee, FluentNHibernate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null not found
                Could not …
Run Code Online (Sandbox Code Playgroud)

c# nhibernate visual-studio-2010 fluent-nhibernate assembly-resolution

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