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

Мне любопытно, есть ли способ выполнить статику .Метод DLL в новом процессе без необходимости создания .EXE для этого?

AFAIK,это невозможно с родной Win32 / 64 DLL. Как насчет сборок DLL .NET?

обновление: Я забыл упомянуть, что мне в первую очередь интересно делать это программно (из кода 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 });

Это должно вам начать работу.

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

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

но если вы хотите начать новый процесс, вы должны начать новый процесс, это обычно делается путем запуска нового .ИСПОЛНЯЕМЫЙ.


Вариант 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 / вызова метода статического класса

2016 Edit: теперь a Пакет Nuget:UnmanagedExports ( src)!

неизвестные директивы MSIL (MSDN forum, 2007) ссылки на бета-версию 1 ссылки программиста языка ассемблера IL (10/3/2000, стр.74), в котором говорится:

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

здесь более подробно эксперт .NET 2.0 Il ассемблер и Внутри Microsoft. NET IL ассемблер. (Лучшие ключевые слова поиска: ilasm vtentry).

связанные чтения:

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

Неуправляемый Экспорт / RGiesecke.Атрибутом dllexport.dll файлы (stackoverflow, 2010)

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

шаблон проекта C# для неуправляемого экспорта (Роберт Гизеке 2010,) - в MSBuild, vs2010 интеграции

IKVM.Обновление отражения: экспорт статических управляемых методов как неуправляемых DLL exports (mono, 2011)

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

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

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

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

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

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

обратный P / Invoke и исключение (блог msdn, 2008)


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


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


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