Можно ли выполнить.NET DLL без EXE, чтобы загрузить его?
Мне интересно, есть ли способ выполнить статический метод.DLL в новом процессе, не создавая для него.EXE?
AFAIK, это невозможно с родными библиотеками Win32/64. Как насчет сборок.NET DLL?
ОБНОВЛЕНИЕ: я забыл упомянуть, что я в первую очередь заинтересован в том, чтобы делать это программно (точнее, из кода C#).
Спасибо!
ЗАКЛЮЧЕНИЕ: Хотя никто не "осмелился" это объяснить, все ответы, похоже, склоняются к "нет". Нужно запустить процесс одним из традиционных способов (EXE, PowerShell и т. Д.), А затем убедить этот процесс загрузить DLL и выполнить код внутри. Я предполагаю, что я ложно надеялся, что управляемые библиотеки DLL способны на большее.
Еще раз спасибо всем, кто присоединился!
5 ответов
Просто запустите приглашение PowerShell.
[Reflection.Assembly]::LoadFile("Name of your dll")
[Your.NameSpace.And.TypeName]::YourMethod()
Я вижу, вы хотите это от C#
Создайте тип, используя квалифицированное имя сборки:
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.
Вариант 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 ( src)!
Неизвестные директивы MSIL(форум MSDN, 2007 г.) ссылаются на бета-версию Справочника программиста на языке ассемблера IL (10/3/2000, стр.74), в которой говорится:
Если указано значение fromunmanaged, среда выполнения автоматически сгенерирует thunk, который преобразует вызов неуправляемого метода в управляемый вызов, вызывает метод и возвращает результат в неуправляемую среду.
Более подробная информация содержится в ассемблере Expert .NET 2.0 IL иInside Microsoft. NET IL Ассемблер. (Лучшие поисковые ключевые слова: ilasm vtentry).
Связанное чтение:
Неуправляемый экспорт: не удается скомпилировать сборку (stackru, 2010)
Неуправляемый экспорт / RGiesecke.DllExport.dll (stackru, 2010)
Создание C# DLL, которую можно импортировать в приложение Delphi с помощью stdcall (stackru, 2009)
Шаблон проекта C# для неуправляемого экспорта ( Robert Giesecke, 2010 г.) - msbuild, интеграция vs2010
Обновление IKVM.Reflection: экспорт статических управляемых методов в виде экспорта неуправляемых DLL (моно, 2011)
Простой метод экспорта DLL без C++ / CLI (codeproject, 2009) - 64-битная поддержка отсутствует?
Как автоматизировать экспорт функции.NET в неуправляемые программы (codeproject, 2006) - поддерживает 64-битные
Что-нибудь было добавлено в.Net 4.0 для поддержки сценариев "Reverse P/Invoke"? (форум MSDN, 2010) - листинг кода
Неуправляемый код может обернуть управляемые методы (codeproject, 2004)
Потенциальные недостатки:
Gotchas с Reverse Pinvoke (неуправляемые к управляемым обратным вызовам кода) (MSDN блог, 2006)
Обратный P/Invoke и исключение (MSDN блог, 2008)
Посмотрите на программу rundll32.exe, которая поставляется с Windows. Если вы знаете определенную информацию о DLL, вы можете иногда использовать эту программу для запуска кода в этой DLL.
Вы можете запустить процесс и запустить функцию DLL, используя rundll32.exe dll_name,method_name
, В C# вы можете сделать что-то вроде этого:
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
Сборка.NET может быть загружена в PowerShell. (Ну, PowerShell - это EXE-файл, но он не предназначен для запуска кода из какой-либо конкретной сборки).