需要从命令行运行一个C# DLL。

13

我有一个 C# 的 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个回答

17

创建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;
  } 
}

为什么这个答案被踩了,这种方法有什么问题吗?在我看来,它实际上非常有前途。 - Mikhail
这应该是答案。 - Justin Dearing
是啊,不开玩笑,这太棒了。 - Michael Socha
尽管这种方法在某些情况下可能是有用的,但我认为它也存在一些限制,例如我无法从rundll32传递一个字符串参数。 - Dmitry Popov
请问您能否举个例子,说明如何使用命令行中的rundll调用此方法? - bboyle1234

14

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

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

顺便提一下,我会将smsSender重命名为SmsSender之类的名称。


2

RunDll32只能与专门设计为从中调用的DLL一起使用。请参见http://support.microsoft.com/kb/164787获取更多信息。

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


感谢。像我说的,对于微软的世界非常陌生。点赞是因为你让我避免了浪费数小时去尝试一些行不通的事情。 - Nico

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接