【问题标题】:call exe from my program从我的程序中调用 exe
【发布时间】:2017-11-28 09:30:41
【问题描述】:

我有硬件制造商的软件,但是我不希望我的客户直接使用这个软件,所以我想通过我的程序调用制造商的软件。

我尝试将 exe 文件嵌入到资源中,但是当我调用它时,我的程序不得不将 exe 写入磁盘,并且我不想公开 .exe 文件。

我还尝试了以下方法:

byte[] bin= Properties.Resources.myPro;
Assembly a = Assembly.Load(bin);
MethodInfo method = a.EntryPoint;

if (method != null)
{
    object o = a.CreateInstance(method.Name);
    method.Invoke(o, null);
}

但运行到 Assembly.Load(bin) 时出现此错误:

无法加载从meter_config加载的文件或程序集'622592字节, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 或其依赖项之一。试图加载格式不正确的程序。

什么是问题,我该如何解决?

【问题讨论】:

标签: c# winforms


【解决方案1】:

首先,您收到的错误消息:

试图加载格式不正确的程序。

这表明.exe 文件不是.NET 程序集。因此,您能够从内存或直接从资源中执行它的可能性基本上为零。您必须将它放在磁盘上的某个位置才能运行。

如果没有更多信息,我只能建议您从临时或隐藏位置运行它。当然,假设您已获得硬件制造商的许可。

我建议你将.exe文件解压到一个随机文件名的临时文件夹中,执行它,然后在它完成操作后删除该文件。如果您愿意,可以添加使用 MoveFileEx API 在重新启动时删除文件。有一个示例here on StackOverflow 说明如何做到这一点。它确保文件在某个时候从计算机中删除。

如果您不想删除该文件,那么另一种选择是将其提取到用户AppData 层次结构深处的路径中。随心所欲地伪装它,也许把它放在一个设置了隐藏标志的文件夹中,等等。

这种混淆不会阻止确定的用户对其进行跟踪,尤其是当它运行超过几秒钟并且可以在任务管理器或进程资源管理器中轻松查看时。除非您希望您的程序被标记为 rootkit,否则您对此无能为力。

另一种方法是查看制造商是否会提供一个可供您使用的 .NET 库,而不是标准的 Windows 可执行文件。

【讨论】:

  • 老实说,“一个坚定的用户”无论如何都会从 .NET 可执行文件中提取资源。我会选择Path.GetTempFileName()
  • @Blorgbeard 取决于您如何处理资源,但是是的。过去我做过压缩的加密资源,但现在我通常甚至不理会压缩,只使用资源,这样我就不必在 1 个文件的情况下发送 5 个文件。
【解决方案2】:

由于您使用的是 C#(通常是托管代码),因此您不能作为非托管程序集加载,因此,如果制造商的程序是用 C 或 C++ 或其他比 C# 更低级别工作的程序开发的,请注意该代码是否是否管理。如果它是非托管的,不幸的是你什么都做不了,除了包括一个静态入口点(如果制造商程序的代码导出了一些方法),就像这样(你可以参考here):

[DebuggerHidden, DebuggerStepperBoundary, DllImport("YourAssemblyLocation", SetLastError = true)]
[return: MarshalAs(UnmanagedType.YourPrimitiveType)]
internal static extern YourMethodType YourMethodName();

我希望这对你有用,并让我知道这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多