使用 C# returns 空值对 CreateProcess 进行后期绑定

Late binding on CreateProcess with C# returns null value

我正在尝试在 kernel32.dll 中对 CreateProcess 函数使用后期绑定,但是,它 returns 是一个不同于任何其他函数的空值。

这是我用于后期绑定的代码

public abstract class LateBinding
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, BestFitMapping = false, SetLastError = true), SuppressUnmanagedCodeSecurity()]
    private static extern LBHandle LoadLibrary(string fileName);

    [DllImport("kernel32.dll"), SuppressUnmanagedCodeSecurity()]
    private static extern IntPtr GetProcAddress(LBHandle hModule, string procname);

    private Delegate Result = default(Delegate);

    public Delegate Call(string library, string method, Type type)
    {
        LBHandle Lib = LoadLibrary(library);
        if (!Lib.IsInvalid && !Lib.IsClosed)
        {
            Result = Marshal.GetDelegateForFunctionPointer(GetProcAddress(Lib, method), type);                
            Lib.Close();
        }
        return Result;
    }
}

[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
public sealed class LBHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool FreeLibrary(IntPtr hModule);

    private LBHandle() : base(true) { }

    protected override bool ReleaseHandle()
    {
        return FreeLibrary(handle);
    }
}

这就是我调用函数的方式

private delegate bool dCreateProcess(string applicationName, string commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref STARTUP_INFORMATION startupInfo, ref PROCESS_INFORMATION processInformation);
dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcess", typeof(dCreateProcess)) as dCreateProcess;

kernel32.dll 实际上并没有导出名称为 CreateProcess 的函数入口点 - 它是 CreateProcessA 或在您的情况下 CreateProcessW 用于 unicode(宽)参数。

kernel32 中没有名为CreateProcess 的函数。它有两个版本 CreateProcessA (ANSI) 和 CreateProcessW (Unicode)。您可以在 documentation for CreateProcess on MSDN 按钮处看到它。

这不是 CreateProcess 独有的,几乎每个接受字符串的 Win32 API 函数都有一个 A 和一个 W 版本。

以下是您想要的:

dCreateProcess CreateProcess = Call("kernel32.dll", "CreateProcessW", typeof(dCreateProcess)) as dCreateProcess;

另见 What is the difference between CreateProcess and CreateProcessA?