12

我有这样定义的 ac# dll:

namespace SMSNotificationDll
{
    public class smsSender
    {
        public void SendMessage(String number, String message)
        {
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "c:\\Program Files\\Java\\jdk1.6.0_24\\bin\\java";
            info.WorkingDirectory = "c:\\";
            info.Arguments = "-jar SendSms.jar "+number + " "+message;
            info.UseShellExecute = false;
            Process.Start(info);
        }
    }
}

我需要从命令行执行它。

有什么办法可以通过rundll32运行它吗?

当我用这个运行它时:

rundll32 SMSNotificationDll.dll, SendMessage 0749965244 hello

我缺少条目:SendMessage。

4

4 回答 4

16

从 c# 创建非托管导出也有一个技巧 - https://www.nuget.org/packages/UnmanagedExports

它是如何工作的?创建一个新的类库或继续现有的类库。然后添加 UnmanagedExports Nuget 包。这几乎是所需的所有设置。现在您可以编写任何类型的静态方法,用 [DllExport] 装饰它并在本机代码中使用它。它就像 DllImport 一样工作,因此您可以使用 MarshalAsAttribute 自定义参数/结果的编组。在编译期间,该任务将修改 IL 以添加所需的导出。

class Test
{
  [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
  public static int TestExport(int left, int right)
  {
     return left + right;
  } 
}
于 2013-08-23T08:23:24.317 回答
14

为什么不创建一个简单的控制台应用程序,将 DLL 称为类库?

namespace SMSNotificationDll
{
    public class SmsSenderProgram
    {
        public static void Main(string[] args)
        {
            // TODO: Argument validation
            new smsSender().SendMessage(args[0], args[1]);
        }
    }
}

顺便说一句,我会重命名smsSenderSmsSender.

于 2011-05-26T12:59:10.000 回答
2

RunDll32 仅适用于专门设计用于从中调用的 DLL。有关详细信息,请参阅http://support.microsoft.com/kb/164787

从命令行运行该 DLL 中的代码的最简单方法是制作一个简单的 C# 命令行应用程序,其唯一目的是调用该方法。

于 2011-05-26T13:00:11.887 回答
1

看到这个问题you can't run a .NET dll using rundll32

于 2011-05-26T13:00:55.333 回答