Нужно запустить aC# dll из командной строки

Я определил 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 ответа

Решение

Почему бы вам просто не создать простое консольное приложение, которое ссылается на DLL как на библиотеку классов?

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

Кстати, я бы переименовал smsSender что-то вроде SmsSender,

Существует хитрость для создания неуправляемого экспорта из 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;
  } 
}

RunDll32 работает только с библиотеками DLL, специально предназначенными для вызова из него. См. http://support.microsoft.com/kb/164787 для получения дополнительной информации.

Самый простой способ запустить код в этой DLL из командной строки - создать простое приложение для командной строки C#, единственной целью которого является вызов этого метода.

Посмотрите на этот вопрос, вы не можете запустить.NET DLL с помощью rundll32

Другие вопросы по тегам