需要从命令行运行ac#dll

Nic*_*ico 12 c# rundll32

我的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要从命令行执行它.

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

当我用它运行它:

rundll32 SMSNotificationDll.dll, SendMessage 0749965244 hello
Run Code Online (Sandbox Code Playgroud)

我错过了条目:SendMessage.

Nic*_*lak 15

有一个技巧可以从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;
  } 
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 14

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

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

顺便说一句,我会重新命名smsSender为类似SmsSender.