【问题标题】:How to add DLL to GAC and embed with exe如何将DLL添加到GAC并嵌入exe
【发布时间】:2013-05-26 03:11:21
【问题描述】:

我需要C# 代码将程序集添加到GAC。有人知道如何使用C# 将DLL 添加到GAC 吗?

编辑: 我正在尝试在窗口应用程序中使用字节加载 dll。由于某些 dll 文件在我的应用程序中正确加载,但是当我尝试加载程序集 (Microsoft_DirectX_AudioVideoPlayback.dll) 时,它给了我 badImage 异常的错误。基本上我只需要使用以下方法从字节数组加载程序集。

byte[] ByteArray = Resource1.Microsoft_DirectX_AudioVideoPlayback;
 Assembly.Load(ByteArray );

其中 BytesArray 是程序集字节数组。

我收到以下几行错误。

试图加载格式不正确的程序。 (来自 HRESULT 的异常:0x8007000B) System.badImageformat 异常:{"An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)"}

【问题讨论】:

  • 这是您作为安装程序的一部分执行的操作,而不是应用程序在运行时执行的操作。
  • @Belogix:不;这是你根本不会做的事情。
  • 让我再解释一下。我创建了一个 .exe 文件,它以字节的形式包含所有这些内容。所以当我运行这个 exe 时,它​​应该会自动打开一个视频。所以请给我建议任何解决方案。
  • @v 代码格式不应该用来增加重点。它适用于代码。此外,代码请求在 Stackoverflow 上通常不受欢迎。
  • 你为什么重复你的问题?如果您从发布到您的问题的答案中尝试了某些内容,但它不起作用 - 在此处显示 - 使用新信息更新或第一个问题。但不要重复你的问题。

标签: c# asp.net assemblies


【解决方案1】:

没有;您无需向 GAC 添加任何内容。

您只需调用 Assembly.Load() 即可直接从文件中嵌入的字节数组加载程序集。
请注意,您需要在 JITer 遇到来自这些程序集的任何类型之前执行此操作。

【讨论】:

    【解决方案2】:
    Publish publish = new Publish();
    
    publish.GacInstall(System.IO.Path.GetFullPath("MyAssembly.dll"));
    

    命名空间:System.EnterpriseServices.Internal

    程序集:System.EnterpriseServices(在 System.EnterpriseServices.dll 中)

    【讨论】:

    • 您需要一个实例。 msdn.microsoft.com/en-us/library/…
    • @SLaks 你是什么意思?
    • Publish 类的实例。
    • 您还需要提及要引用的程序集和命名空间。
    • 这很重要;否则,人们将不知道如何使用它。
    【解决方案3】:

    当您包含视频文件时,您必须将其作为“嵌入式资源”包含在内。 如果您不知道如何操作,请按照以下步骤操作。

    1. 将您的视频文件添加到项目中。
    2. 点击视频文件。转到属性。
    3. 选择构建操作“嵌入式资源”

    然后使用下面的类以字节数组的形式检索视频。我相信你可以处理剩下的事情。

        using System.IO;
        using System.Reflection;
    
        namespace MyProject.Video
        {
            class MyVideoClass
            {
                private const string videoExtract = "MyProject.Video.MyVideo.dat";      
    
                public byte[] GetStream()
                {
                    try
                    {
                        var memoryStream = new MemoryStream();
                        Stream sourceStream = null;
    
                        sourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(videoExtract); 
    
                        if (sourceStream != null) sourceStream.CopyTo(memoryStream);
    
                        return memoryStream.ToArray();
                    }
                    catch
                    {
                        return null;
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-01
      相关资源
      最近更新 更多