我正在尝试使用 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...失败。
我怎样才能让它发挥作用?谢谢你!
我正在做的是获取我所有引用的程序集,然后获取程序集中定义的类型。在循环遍历并获得 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) 由于文档丰富,我设法在非托管程序中托管 CLR。但是,当托管 CLR 时,似乎只能从硬盘驱动器加载程序集 - 当运行托管应用程序时,可以通过调用 Assembly.Load() 从内存加载程序集。
有没有办法从内存中执行托管 CLR 中的程序集?喜欢:
我已经在网络和 MSDN 上搜索了几个小时,但找不到解决此问题的方法!我想出的解决方法将涉及另一个调用 Assembly.Load() 的程序集 - 但是我担心这可能有点矫枉过正。
在此先感谢您的任何提示或提示!
我的应用程序报告它已加载一个名为“Microsoft.GeneratedCode”的程序集。我想验证我的应用程序或程序集的哪个部分正在生成此特定程序集。该程序集仅加载一次。
有关加载的程序集的详细信息:
通常,我的应用程序通过使用 Apache.NMS 1.7.0.3635、Apache.NMS.ActiveMQ 1.7.0.3660 连接到 Apache ActiveMQ,另一方面,我的应用程序处理包含序列化模型 (XML) 的 HTTPS 请求/响应。
在我的研究中,我找到了答案,这表明程序集“Microsoft.GeneratedCode”与 XML 序列化有关。
一个旧项目的引用路径不好,我所拥有的只是名称msdatasrc。
有大量网站提供.dll的免费下载,但它们看上去都很阴暗。
msdatasrc.dll文件通常位于哪里?
如果设备上不存在它,可以从哪里检索?
我刚刚安装了 reflexil v2.0 插件,但是当我在突出显示一个方法后单击它时,它只显示 3 个子菜单:删除、重命名、更新反射器对象模型......我没有看到另存为、注入菜单..谁能帮我解决这个问题?
我正在构建一个 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) C# 7.1引入了一些新的命令行参数来帮助创建“参考程序集”。通过文档,它输出一个程序集,其中:
将它们的方法体替换为单个 throw null 体,但包括除匿名类型之外的所有成员。
我发现了一个有趣的注释,它在变化时更加稳定:
这意味着它的更改频率低于完整的程序集——许多常见的开发活动不会更改接口,只会更改实现。这意味着增量构建可以更快 - ...
我们将介绍第二个概念,即“参考组件”(也称为骨架组件)。[---]它们将用于构建场景。
.. 无论这些“构建场景”对于罗斯林来说是什么。
据我所知,对于普通的 .NET 程序集用户来说,此类程序集可能更小,并且加载反射的速度稍快。好的但是:
它的用处似乎相当小众。
因此,我想知道通用程序集生成器方面的事情 - 什么时候应该考虑显式使用这些新的编译器标志来创建引用程序集?除了罗斯林本身之外,它还有任何实际用途吗?
我有一个用于存档 Exchange 邮箱的 C# / .NET Windows 服务,并且我最近“打包”了 Veeam O365 Backup DLL,以便能够自动备份 Exchange Online 邮箱。
我将向您展示一些日志,显示该程序运行一段时间没有问题,然后开始突然失败并出现错误:
...直到服务重新启动:
(参见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) 我目前正在开发一个项目,该项目应该作为多个附加组件的框架工作,这些附加组件应该在运行时加载。
我的任务是在我的应用程序文件夹中具有以下结构:
System.Windows.Interactivity.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-assembly ×10
c# ×7
.net ×5
reflection ×3
.net-core ×1
c#-7.1 ×1
c++ ×1
clr ×1
com-interop ×1
coreldraw ×1
dependencies ×1
disassembly ×1
plugins ×1
powershell ×1
reflexil ×1
roslyn ×1
veeam ×1