Подтвердить что ты не робот

Возможно ли выполнить .NET dll без exe, чтобы загрузить его?

Мне любопытно, есть ли способ выполнить статический метод .LLL в новом процессе, не создавая для него .EXE?

AFAIK, это невозможно с использованием родных DLL Win32/64. Как насчет сборников .NET DLL?

ОБНОВЛЕНИЕ. Я забыл упомянуть, что я в первую очередь заинтересован в том, чтобы делать это программно (из кода С#, чтобы быть конкретным).

Спасибо!

ЗАКЛЮЧЕНИЕ. Хотя никто не "осмелился" описать это, все ответы, похоже, склоняются к "нет". Нужно запустить процесс с помощью одного из обычных способов (EXE, PowerShell и т.д.), А затем убедить этот процесс загрузить DLL и выполнить код внутри. Наверное, я ошибочно надеялся, что управляемые DLL способны больше.

Еще раз спасибо всем, кто вошел!

4b9b3361

Ответ 1

Просто запустите приглашение PowerShell.

  [Reflection.Assembly]::LoadFile("Name of your dll")
  [Your.NameSpace.And.TypeName]::YourMethod()

Я вижу, что вы хотите этого с С#

Создайте тип, используя присвоенное для сборки имя:

 var t = Type.GetType("NameSpace.Type,Name Of Dll");
 var m = t.GetMethod("NameOfMethod");
 m.Invoke(null, new object[] { params });

Это должно помочь вам начать.

Я точно не знаю, что вы подразумеваете под "В новом процессе", но не должно быть трудно обернуть это в .exe/.ps1, который вы можете начать с некоторой опции в командной строке.

Таким образом, вам не нужно создавать новый .exe для каждой DLL, которую вы хотите вызвать.

Но если вы хотите запустить новый процесс, вы должны запустить новый процесс, это обычно делается путем запуска нового .EXE.

Ответ 2

Вариант 1:.NET InstallUtil (часть обычной установки .NET)

Добавьте ссылку на System.Configuration.Install, затем оставьте что-то подобное в своей сборке:

[System.ComponentModel.RunInstaller(true)]
public class Sample : System.Configuration.Install.Installer
{
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        base.Uninstall(savedState);

        this.Context.LogMessage("This can be in a .dll.");
        // Do your thing...
    }
}

Затем оскорбляйте .NET InstallUtil:

%windir%\Microsoft.NET\Framework\v2.0.50727\installutil /logtoconsole=false /logfile= /u [your assembly .dll here]

Это может быть немного беспорядочно, особенно без всех параметров командной строки, отключающих протоколирование.

Вариант 2: использовать встроенный rundll32 для инверсии P/Invoke для метода статического класса

2016 Редактирование: теперь пакет Nuget: UnmanagedExports (ЦСИ)!

Неизвестные директивы MSIL (msdn forum, 2007) ссылки на бета-версию 1-го выпуска справочника программиста на языке ИГ (10/3/2000, pg.74), который гласит:

Если задано значение ununaged, время выполнения автоматически генерирует thunk, который преобразует неуправляемый вызов метода на управляемый вызов, вызов метод и вернуть результат в неуправляемая среда.

Более подробно в Expert.NET 2.0 IL-ассемблер и внутри Microsoft.NET IL Assembler. (Лучшие ключевые слова: ilasm vtentry).

Связанное чтение:

Неуправляемый экспорт: невозможно собрать сборку (stackoverflow, 2010)

Неуправляемый экспорт /RGiesecke.DllExport.dll (stackoverflow, 2010)

Создайте DLL С#, которая может быть импортирована в приложение Delphi с помощью stdcall (stackoverflow, 2009)

Шаблон проекта С# для неуправляемого экспорта (Robert Giesecke, 2010) - msbuild, интеграция vs2010

IKVM.Reflection Update: экспортировать статические управляемые методы как неуправляемый экспорт DLL (mono, 2011)

Простой способ экспорта DLL без С++/CLI (codeproject, 2009) - нет 64-битной поддержки?

Как автоматизировать экспорт функции .NET в неуправляемые программы (codeproject, 2006) - поддерживает 64-разрядный

Было ли что-то добавлено в .Net 4.0 для поддержки сценариев "Reverse P/Invoke" ? (msdn forum, 2010) - список кодов

Неуправляемый код может обернуть управляемые методы (codeproject, 2004)

Потенциальные недостатки:

Gotchas with Reverse Pinvoke (неуправляемые обратные вызовы с управляемым кодом) (msdn blog, 2006)

Обратный P/Вызов и исключение (msdn blog, 2008)

Ответ 3

Посмотрите программу rundll32.exe, которая поставляется с окнами. Если вы знаете определенную информацию о dll, вы можете иногда использовать эту программу для запуска кода в этой DLL.

Ответ 4

.NET Assembly может быть загружен в PowerShell. (Ну, PowerShell - это EXE, но не предназначен для запуска кода из любой конкретной сборки)

Ответ 5

Вы можете запустить процесс и запустить функцию dll с помощью rundll32.exe dll_name,method_name. В С# вы можете сделать что-то вроде этого:

myProcess = new Process {StartInfo = {FileName = "rundll32.exe", Arguments = "my_dll_name.dll,my_function_name"}};
myProcess.Start();

Просто убедитесь, что DLL находится в вашем PATH. Если вы подумываете о проведении какого-либо модульного тестирования, убедитесь, что вы убили процесс по методу TearDown/CleanUp: myProcess.Kill(), в противном случае DLL может оставаться загруженным и вы не сможете перезаписать его как часть вашей разработки обработать. Вы также должны изучить эту статью для приложения командной строки, которое убьет все процессы, хранящие вашу DLL, и добавит их в ваши события Pre-Build: freelib.exe my_dll_name.dll