标签: .net-assembly

创建 COM 互操作类的实例

我正在尝试使用 C# 从我的程序中打开 CorelDRAW。到目前为止,我已经能够通过引用适当的 com 库并调用来做到这一点

CorelDRAW.Application draw = new CorelDRAW.Application();
draw.Visible = true; 
Run Code Online (Sandbox Code Playgroud)

但是,我希望我的程序能够与任何支持互操作的 CorelDRAW 版本一起使用。我尝试使用反射在运行时加载互操作库,可以为正确的版本选择特定的 dll。通过环顾四周,我尝试了以下方法。

string path = "Interop.CorelDRAW.dll";
Assembly u = Assembly.LoadFile(path);
Type testType = u.GetType("CorelDRAW.Application");

if (testType != null)
{
    object draw = u.CreateInstance("CorelDRAW.Application");

    FieldInfo fi = testType.GetField("Visible");
    fi.SetValue(draw, true);
}
Run Code Online (Sandbox Code Playgroud)

该程序失败了,u.CreateInstance...因为它CorelDRAW.Application是一个接口,而不是一个类。我还尝试替换CorelDRAW.Application为,CorelDRAW.ApplicationClass因为当我浏览 Interop.CorelDRAW 作为资源时可用,但随后u.getType...失败。

我怎样才能让它发挥作用?谢谢你!

c# reflection com-interop coreldraw .net-assembly

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

从程序集中获取类型在某些 Type.Name 的末尾添加“'1”

我正在做的是获取我所有引用的程序集,然后获取程序集中定义的类型。在循环遍历并获得 Type.Name 之后,大部分类型名称的末尾都包含 '1。这是什么原因?下面是我目前用来剥离它的代码:

AssemblyName[] assemblyNames = Assembly.GetExecutingAssembly().GetReferencedAssemblies();

      foreach (AssemblyName assemblyName in assemblyNames)
                {
                    if (assemblyName.Name == @namespace)
                    {
                        Assembly assembly = Assembly.Load(assemblyName);

                        var types = assembly.GetTypes().OrderBy(x => x.Name);
                        foreach (Type type in types)
                        {
                           if (!type.Name.Contains("1"))    //'1 is appearing at the end for some reason
                            cmbBoxCallFlowStage.Items.Add(type.Name);
                        else      
                            cmbBoxCallFlowStage.Items.Add(type.Name.Substring(0, type.Name.Length - 2));     //removing "'1" from the string
}
Run Code Online (Sandbox Code Playgroud)

c# .net-assembly

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

在非托管程序中承载 CLR 时从内存加载程序集

由于文档丰富,我设法在非托管程序中托管 CLR。但是,当托管 CLR 时,似乎只能从硬盘驱动器加载程序集 - 当运行托管应用程序时,可以通过调用 Assembly.Load() 从内存加载程序集。

有没有办法从内存中执行托管 CLR 中的程序集?喜欢:

  1. 将托管程序集写入内存
  2. 启动 CLR
  3. 启动 CLR
  4. 从内存执行托管程序集
  5. 等待托管程序集返回
  6. 停止 CLR

我已经在网络和 MSDN 上搜索了几个小时,但找不到解决此问题的方法!我想出的解决方法将涉及另一个调用 Assembly.Load() 的程序集 - 但是我担心这可能有点矫枉过正。

在此先感谢您的任何提示或提示!

.net c++ reflection clr .net-assembly

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

程序集“Microsoft.GeneratedCode”已加载

我的应用程序报告它已加载一个名为“Microsoft.GeneratedCode”的程序集。我想验证我的应用程序或程序集的哪个部分正在生成此特定程序集。该程序集仅加载一次。

有关加载的程序集的详细信息:

  • IsDynamic = 真
  • 名称 = Microsoft.GeneratedCode
  • 版本 = 1.0.0.0 文化 = 中性
  • PublicKeyToken = null
  • ImageRuntimeVersion = "v4.0.30319"

通常,我的应用程序通过使用 Apache.NMS 1.7.0.3635、Apache.NMS.ActiveMQ 1.7.0.3660 连接到 Apache ActiveMQ,另一方面,我的应用程序处理包含序列化模型 (XML) 的 HTTPS 请求/响应。

在我的研究中,我找到了答案,这表明程序集“Microsoft.GeneratedCode”与 XML 序列化有关。

.net c# .net-assembly

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

缺少msdatasrc程序集参考

一个旧项目的引用路径不好,我所拥有的只是名称msdatasrc。

有大量网站提供.dll的免费下载,但它们看上去都很阴暗。

msdatasrc.dll文件通常位于哪里?

如果设备上不存在它,可以从哪里检索?

dependencies .net-assembly

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

.NET 反射器 + Reflexil 插件

我刚刚安装了 reflexil v2.0 插件,但是当我在突出显示一个方法后单击它时,它只显示 3 个子菜单:删除、重命名、更新反射器对象模型......我没有看到另存为、注入菜单..谁能帮我解决这个问题?

plugins disassembly .net-assembly reflexil

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

使用 AppDomain 临时加载程序集

我正在构建一个 WPF 工具,它将通过反射分析目标应用程序的程序集。

到目前为止,我一直在使用Assembly.Loadetc. 来加载目标程序集。这没问题,只是它有一些限制:我希望能够重建目标应用程序并“刷新”工具以重新分析新建的程序集。目前这不起作用,因为程序集在加载时被锁定,并且在工具退出之前不会释放。这也阻止了重新加载新建的程序集。

我相信我可以创建一个临时 AppDomain,将程序集加载到其中,执行我想做的反射,然后卸载域。

我遇到的问题是我无法让它工作。我尝试了多种变化并得到了结果,例如:

  • 加载到当前应用程序域,而不是我显式创建的应用程序域
  • 加载请求的程序集时出错
  • 加载工具的程序集时出错(?)

例如,遵循此处的建议:创建自定义 AppDomain 并向其中添加程序集

SimpleAssemblyLoader这样创建了一个:

public class SimpleAssemblyLoader : MarshalByRefObject
{
    public Assembly Load(string path)
    {
        ValidatePath(path);

        return Assembly.Load(path);
    }

    public Assembly LoadFrom(string path)
    {
        ValidatePath(path);

        return Assembly.LoadFrom(path);
    }

    public Assembly UnsafeLoadFrom(string path)
    {
        ValidatePath(path);

        return Assembly.UnsafeLoadFrom(path);
    }

    private void ValidatePath(string path)
    {
        if (path == null) throw new ArgumentNullException(nameof(path));
        if (!System.IO.File.Exists(path))
            throw new ArgumentException($"path \"{path}\" does not exist");
    }
}
Run Code Online (Sandbox Code Playgroud)

...并在调用方法中使用它:

    private static AppDomain …
Run Code Online (Sandbox Code Playgroud)

.net c# .net-assembly

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

何时创建和分发“参考程序集”?

C# 7.1引入了一些新的命令行参数来帮助创建“参考程序集”。通过文档,它输出一个程序集,其中:

将它们的方法体替换为单个 throw null 体,但包括除匿名类型之外的所有成员。

我发现了一个有趣的注释,它在变化时更加稳定

这意味着它的更改频率低于完整的程序集——许多常见的开发活动不会更改接口,只会更改实现。这意味着增量构建可以更快 - ...

对于罗斯林本身来说可能是必要的..

我们将介绍第二个概念,即“参考组件”(也称为骨架组件)。[---]它们将用于构建场景。

.. 无论这些“构建场景”对于罗斯林来说是什么。

据我所知,对于普通的 .NET 程序集用户来说,此类程序集可能更小,并且加载反射的速度稍快。好的但是:

  • 通常您还关心执行,并且实现程序集已经包含参考程序集的所有数据,
  • 通常你并不关心加载时的微小性能差异,
  • 最重要的是 - 通常您根本没有可用(分布式)的精简参考程序集。

它的用处似乎相当小众。

因此,我想知道通用程序集生成器方面的事情 - 什么时候应该考虑显式使用这些新的编译器标志来创建引用程序集?除了罗斯林本身之外,它还有任何实际用途吗?

c# .net-assembly roslyn c#-7.1

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

无法加载文件或程序集...但一开始就不行?

我有一个用于存档 Exchange 邮箱的 C# / .NET Windows 服务,并且我最近“打包”了 Veeam O365 Backup DLL,以便能够自动备份 Exchange Online 邮箱。

我将向您展示一些日志,显示该程序运行一段时间没有问题,然后开始突然失败并出现错误:

  • 无法加载文件或程序集“System.IO.Compression,Version=4.2.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。

...直到服务重新启动:

(参见Edit1,我的图片被覆盖了)

堆栈跟踪:

System.Management.Automation.CmdletInvocationException: Could not load file or assembly 'System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) ---> System.IO.FileLoadException: Could not load file or assembly 'System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The located assembly's manifest definition does not match the assembly …
Run Code Online (Sandbox Code Playgroud)

.net c# powershell .net-assembly veeam

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

在运行时加载带有子文件夹引用的程序集

我目前正在开发一个项目,该项目应该作为多个附加组件的框架工作,这些附加组件应该在运行时加载。

我的任务是在我的应用程序文件夹中具有以下结构:

  • 2 带有子文件夹的目录。一个名为“ /addons ”的附加组件和一个名为“ /ref ”的用于这些插件可能使用的任何附加引用(如System.Windows.Interactivity.dll
  • 当从应用程序的菜单中选择一个附加组件时,.dll 应该在运行时加载,并且应该打开一个预设的入口点
  • 新加载的程序集的所有引用也应加载。

我知道加载附加组件时的子文件夹和文件名,因此我只需使用Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location))Path.Combine()构建 .dll 的路径,然后Assembly.LoadFile()在使用反射之前加载它assembly.GetExportedTypes()以找到为我的“EntryPointBase”继承的类,然后用Activator.CreateInstance().

但是,只要我的附加组件中有任何引用System.IO.FileNotFoundException就会弹出一个针对该引用的目标assembly.GetExportedTypes()

我构建了一个方法来加载所有引用的程序集,甚至递归地从引用加载所有引用,如下所示:

public void LoadReferences(Assembly assembly)
{

  var loadedReferences = AppDomain.CurrentDomain.GetAssemblies();

  foreach (AssemblyName reference in assembly.GetReferencedAssemblies())
  {
    //only load when the reference has not already been loaded 
    if (loadedReferences.FirstOrDefault(a => a.FullName == reference.FullName) == null)
    {
      //search in all subfolders
      foreach (var location in Directory.GetDirectories(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)))
      {
        //GetDirectoriesRecusrive searchs all …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection .net-assembly .net-core

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