Нужно запустить c # dll из командной строки - PullRequest
10 голосов
/ 26 мая 2011

У меня есть 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 ]

15 голосов
/ 23 августа 2013

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

Почему бы вам просто не создать простое консольное приложение, которое ссылается на 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 голосов
/ 26 мая 2011

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

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

0 голосов
/ 26 мая 2011

См. Этот вопрос вы не можете запустить .NET dll, используя rundll32

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...