C# 从我的程序调用exe

C# 从我的程序调用exe,c#,winforms,C#,Winforms,我有硬件制造商的软件,但我不希望我的客户直接使用此软件,因此我想通过我的程序调用制造商的软件 我试图将一个exe文件嵌入到一个资源中,但当我调用它时,我的程序不得不将exe文件写入磁盘,我不想公开.exe文件 我还尝试了以下方法: byte[] bin= Properties.Resources.myPro; Assembly a = Assembly.Load(bin); MethodInfo method = a.EntryPoint; if (method != null) {

我有硬件制造商的软件,但我不希望我的客户直接使用此软件,因此我想通过我的程序调用制造商的软件

我试图将一个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)时出现此错误:

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

什么问题,我如何修复它?

< p>因为你使用的是C(通常是托管代码),你不能作为非托管程序集加载,所以,如果制造商的程序是用C或C++开发的,或者其他的工作在C级别以下,那么小心代码是否被管理。如果它是非托管的,很遗憾,除了包含一个静态入口点(如果制造商程序的代码导出了一些方法)之外,您什么都做不了(您可以引用):


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

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

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

这表示
.exe
文件不是.NET程序集。因此,您基本上不可能从内存或直接从资源执行它。为了让它运行,你必须把它放在磁盘上的某个地方

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

我建议您使用随机文件名将
.exe
文件提取到临时文件夹中,执行它,然后在完成操作后删除该文件。如果需要,可以添加或使用MoveFileEx API在重新启动时删除文件。这里有一个关于如何做到这一点的例子。它确保在某个时候从计算机中删除该文件

如果您不想删除该文件,那么另一个选项是将其提取到用户的
AppData
层次结构的深层路径中。伪装它,但你喜欢,也许把它放在一个文件夹与隐藏标志设置,等等

这种模糊处理不会阻止已确定的用户跟踪它,特别是当它运行超过几秒钟并且可以在任务管理器或Process Explorer中轻松看到时。除非您希望您的程序被标记为rootkit,否则您对此无能为力


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

此exe是.NET程序集还是本机可执行文件?似乎.exe还需要加载其他依赖项(.dll)。另请参见:此问题适用于VB.NET,但可能是您的答案。老实说,“一个有决心的用户”无论如何都会从.NET可执行文件中提取资源。我会选择
Path.GetTempFileName()
@Blorgbeard取决于您如何处理资源,但是是的。我以前做过压缩加密的资源,但现在我一般都不去做压缩,只使用资源,这样我就不必在1个文件可用时发送5个文件。
[DebuggerHidden, DebuggerStepperBoundary, DllImport("YourAssemblyLocation", SetLastError = true)]
[return: MarshalAs(UnmanagedType.YourPrimitiveType)]
internal static extern YourMethodType YourMethodName();