标签: .net-assembly

C#.NET 中程序集、模块和包的区别

一些术语没有明确的答案,许多博客和/或人们对术语程序集、模块、包的看法略有不同。

我对了解正确术语的实际差异和用法以及使用非常感兴趣。我知道Assembly 的含义及其各种分类。但是,我不清楚术语模块和包。我对模块/包的看法是,它是一个程序集的集合,但是,我在某处看到,一个程序集可以有多个程序集。

有人可以帮助我理解 .NET 以及通用软件平台的正确定义、分类、示例和用法。

.net c# module package .net-assembly

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

BinaryFormatter 忽略程序集版本

我有以下方法来生成对象的散列。它工作得很好!但是当我更改程序集的版本时,即使对象相同,哈希也会发生变化。

public static string GetHash(Object item)
{
    MemoryStream memoryStream = new MemoryStream();
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(memoryStream, item);
    binaryFormatter.AssemblyFormat = FormatterAssemblyStyle.Simple;

    HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider();
    memoryStream.Seek(0, SeekOrigin.Begin);

    return Convert.ToBase64String(hashAlgorithm.ComputeHash(memoryStream));
}
Run Code Online (Sandbox Code Playgroud)

怎么可能忽略程序集版本?

c# serialization binaryformatter .net-assembly

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

无法加载文件或程序集“Antlr3.Runtime”

无法加载文件或程序集“Antlr3.Runtime”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。

仅在 IIS 中收到此错误。

在安装了框架 4.5 VS 2012 express 后,我使用 MachineKeyCryptography 遇到了异常。所以我卸载了 4.5 Framework 和 VS 2012,因此发生了这种混乱。

感谢任何帮助解决此问题并使我的应用程序正常工作的帮助。谢谢

.net .net-assembly iis-7.5

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

从程序集中公开不同的类型名称(别名)

这个问题与我之前的一个未回答的问题有关,因为我仍在解决同样的问题;不过,这是一种不同的方法。

我目前在 C# .NET 项目中使用第三方 SOAP Web 服务。不幸的是,生成的客户端代理类和类成员的名称与我当前的约定不一致。

除非另有建议,否则我只能假设Svcutil不支持别名(不过,在那个级别似乎最容易实现

我现在正在考虑将 Web 服务消费包装到它自己的项目中,即组装,并简单地从其他项目中引用它。我正在考虑这一点,因为可以添加一些(大概是程序集级别的)声明来公开名称与程序集中定义的名称不同的公共类型。

我的问题是;是否可以公开与程序集中定义的类型/成员名称不同的类型/成员名称,本质上是它们的别名?

例如,给定一个神奇的程序集属性:

[assembly: AssemblyTypeAlias(
    Type = typeof(Foo.Bar.qux),
    Name = "Qux"
)]
Run Code Online (Sandbox Code Playgroud)

因此,引用此程序集的项目将Foo.Bar.qux作为Foo.Bar.Qux.

当然,类似的类级别属性也很好,因为生成的代理是partial

namespace Foo.Bar
{
    [Alias("Qux")]
    public partial class qux 
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

产生相同的效果。

虽然我只用我的理论示例介绍了类型名称,但允许对成员名称使用别名的解决方案将非常出色

编辑:我说过“别名”,其中更适用的术语是“重命名”,以隐藏原始名称;最好是后者,但前者会起作用。

.net c# alias class .net-assembly

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

如何加快 .NET 程序集加载性能

我们有一个包含大约 50 个程序集(DLL 文件)的产品,其中大部分是在主可执行文件启动时需要和加载的。结果是即使在中等速度的机器上,加载程序集和对其进行 JIT 的时间也需要 2-3 秒,这在我们的情况下是不可接受的开销。

如果我们加载一次程序并从同一个仍在运行的可执行文件中多次运行它,则计时从几毫秒开始。但对于最终用户来说,这不是一个选项,他们将从命令行运行它。

我想在第一次实例化可执行文件时加快加载速度。冷启动(重新启动 Windows 后)和热启动之间有一个小的加速,但只是略微加速。我们可以使用 .NET 中哪些技术或工具来加速加载(注意:我们尝试了 ILMERGE,它只能帮助大约 30%,而 NGEN 不是一个选项,它需要在各种系统和架构上运行)。

我正在考虑创建一个服务和/或一个特定的 CLR 托管环境,但希望有一个更简单、更琐碎的解决方案。我还没有尝试过 GAC。

.net performance .net-assembly

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

在 .NET 中重新加载程序集而不创建新的 AppDomain

我正在使用 C# 开发游戏引擎 + 编辑器。这个想法是用户将他的所有游戏代码写在编辑器将加载的项目中,因此它可以列出用户定义的类,并在场景编辑器中实例化它们。

搞乱(重新)加载 DLL 的概念,我可以加载 DLL,实例化和调用在外部程序集中定义的类上的方法,重建外部程序集,然后在主机中再次加载它,而无需重新启动主机。这项工作(至少看起来像),但是它并没有从先前加载的程序集中释放内存。

加载器类:

public class Loader
{
    // This DLL contains an implementation of ILoadable - ILoadable is declared in a shared project.
    private const string AsmPath = @"D:\Dev\AsmLoading\AsmLoadingImpl\bin\Debug\AsmLoadingImpl.dll";

    public ILoadable GetExternalLoadable()
    {
        var asmBytes = File.ReadAllBytes(AsmPath);
        Assembly asm = Assembly.Load(asmBytes, null);
        var loadableInterface = typeof(ILoadable);
        var loadableImpl = asm.GetTypes().First(loadableInterface.IsAssignableFrom);
        return (ILoadable)Activator.CreateInstance(loadableImpl);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行GetExternalLoadable()2 或 3 次,任务管理器显示我的主机程序中的 RAM 使用量增加了约 1mb,重复相同的操作将进一步增加它,而不会减少。

有没有办法解决这个问题?我知道 Unity 正在做类似的事情,除了它们实际上自己编译外部程序集,但是当我触发几次重新编译时,Unity 编辑器不会消耗额外的内存。

所以,我想要完成的是外部程序集的“实时重新加载”

.net c# .net-assembly

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

使用 C# exe 修改不同 C# exe 的资源

解决了!见下文。

我有 2 个 C# 应用程序。应用程序 a 应该修改应用程序 b 的内部资源。应用程序 b 应该在执行时对其(修改后的)资源执行某些操作。

我怎样才能做到这一点?

这是我尝试过的:

public static void addFileToResources(string dest, string src)
{
    Assembly a_dest = Assembly.LoadFile(dest);

    using (Stream s_dest = a_dest.GetManifestResourceStream("Elevator.Properties.Resources.resources"))
    {
        using (ResourceWriter rw = new ResourceWriter(s_dest))
        {
            byte[] b_src = File.ReadAllBytes(src);
            rw.AddResource("target", b_src);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在EDIT上得到了一个System.ArgumentException, 因为 .net 资源似乎不可能:还有其他方法吗? 我想生成一个可执行的单个文件(即 application的 exe ),并且可以处理从 application 执行之前给出的数据(存储在 exe 中)。最好不必为了给它数据而实际编译。 为了使它更容易一些假设:The stream is readonly.System.Resources.ResourceWriter..ctor(Stream stream)



bab


  • a 总是在之前执行 b
  • a 只执行一次
  • 两个应用程序都是我写的 …

c# resources .net-assembly

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

在 app.config <assemblyBinding>/<codeBase> 中配置任何较新程序集版本的 .NET 程序集绑定

在 C# 项目中,我使用外部程序集并将其添加到项目的 References 中。假设程序集称为“ ABC ”,位于版本1.0.0.0 的编译时c:\complie-time\abc.dll。“复制本地”设置为 false。

因为它不是本地复制的,所以必须在 app.config 中指定程序集位置。

<runtime>
 <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="ABC"  culture="neutral" publicKeyToken="xyz"/>
    <codeBase version="????" href="FILE://c:/ABC-install/abc.dll"/>
  </dependentAssembly>
 </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

ABC 程序集由 ABC 应用程序安装提供。所以在运行时,dll 位于不同的位置c:\ABC-install\abc.dll

问题是:我应该在codeBase版本中放什么?

如果用户安装ABC的新版本说1.1.0.0,它被称为是向下兼容的,上面将无法工作,因为.NET框架正在寻找版本1.0.0.0C:\ ABC安装\ ABC。 dll如果我把 1.0.0.0 放在那里。

条件是在编译时我们不知道 c:\ABC-install 中的版本号是多少。我们所知道的是它向后兼容。该项目应该能够与所有版本的 ABC 程序集一起运行。

如何配置 app.config 以允许绑定外部程序集的较新版本,但在编译时未知运行时版本,而在编译时项目是基于参考设置中的 1.0.0.0 dll 构建的?

编辑:codeBase 版本为 ???? 清楚地表明问题。

.net c# app-config .net-assembly assembly-binding-redirect

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

如何将当前应用程序域的程序集动态加载到 C# 项目?

我正在尝试将第三方assemblies 动态加载到项目中并用于reflection创建其类型的实例。

我用了:

Assembly.LoadFrom("Assembly1.dll")
Assembly.LoadFrom("Assembly2.dll")
Assembly.LoadFrom("Assembly3.dll") 
Run Code Online (Sandbox Code Playgroud)

另外,试过:

AppDomain.CurrentDomain.Load("Assembly1.dll")
AppDomain.CurrentDomain.Load("Assembly2.dll")
AppDomain.CurrentDomain.Load("Assembly3.dll") 
Run Code Online (Sandbox Code Playgroud)

但是,The method is not implemented当我尝试创建其中一种类型的实例时,我不断收到异常,如下所示:

Assembly.LoadFrom("Assembly1.dll")
Assembly.LoadFrom("Assembly2.dll")
Assembly assembly=  Assembly.LoadFrom("Assembly3.dll")
Type type=assembly.GetType("Assembly3.Class1")
object instance=Activator.CreateInstance(type); //throws exception at this point
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接在项目中add referenceAssembly1、Assembly2 和Assembly3执行以下操作:

Assembly3.Class1 testClass=new Assembly3.Class1();
Run Code Online (Sandbox Code Playgroud)

我也不例外

我只是想知道我做错了什么?如何将程序集动态加载到项目中。我猜,因为创建Class1实例依赖于另一个程序集Assembly1Assembly2,所以它的失败。那么,如何将所有依赖程序集动态加载到appdomain/loadcontext.

非常感谢您的回答。

.net c# .net-assembly

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

PowerShell 二进制模块程序集依赖错误

我正在开发PowerShell 二进制模块。它使用Json.NET和其他库。

我收到此异常“无法加载文件或程序集 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其依赖项之一。系统找不到指定的文件。”

在硬盘上,我有一个更新版本(版本 7.0.2)

像这样的问题在控制台、网络或桌面应用程序中很容易解决,通过这样的行使用app.config或“web.config”

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

如何为 PowerShell 二进制模块做类似的事情?

c# powershell json .net-assembly

5
推荐指数
2
解决办法
1801
查看次数