Может C#.сборка dll содержит точку входа?
моя цель-создать исполняемый файл, который запустит теневое скопированное приложение. Фокус в том, что я хочу, чтобы эта стартовая программа не имела внешних зависимостей и не содержала никаких знаний о программе, которую она должна запустить.
Я также хочу, чтобы это был единственный исполняемый файл в каталог. Другими словами, Я хочу, чтобы он" запускал " a .dll сборка не an .exe сборки. (Я могу потребовать, чтобы имя .dll-файл, загружаемый в новый AppDomain, будет таким же каждый раз, как Главный.dll или что-то в этом роде.)
похоже AppDomain.ExecuteAssembly сделал бы именно то, что я хотел. В нем говорится, что он начнет выполнение в "точке входа, указанной в заголовке .NET Framework.".
когда я пытаюсь использовать эту функцию, я получаю ошибку "точка входа не найдена в сборке "DllApp"".
начальная программа у меня есть, просто пытаюсь запустить сборку:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain( "DllApp" );
domain.ExecuteAssembly( "DllApp.dll" );
}
код приложения, в a .DLL файл, с точка входа по умолчанию:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
эта страница на Main () функции говорит, что "для библиотек и служб не требуется метод Main в качестве точки входа". Он не говорит, что они не может есть точка входа по умолчанию.
Я пробовал все различные перестановки public / private static void main, тип возврата int, string[] args в качестве аргументов, с пространством имен, без пространства имен, статическим / нестатическим классом и т. д.
я смог измените мой код для наследования от MarshalByRefObject, а затем используйте CreateInstance для создания объекта, но похоже, что он будет более тесно связывать стартер с программой, которую он должен запустить. Если бы я мог использовать ExecuteAssembly, запускаемое приложение просто нуждалось бы в static void Main, и это действительно просто и сложно испортить.
возможно ли это для a .сборка dll, чтобы иметь точку входа по умолчанию, и для ExecuteAssembly, чтобы найти ее, или мне просто нужно уйти в отставку на другой маршрут?
3 ответов
вы можете скомпилировать приложение .NET как exe (который является сборкой) и переименовать его в.DLL и он будет действовать как обычный .NET .сборка dll. Тогда у него будет ваша точка входа.
Я нашел совет не так легко следовать. После некоторых экспериментов я пришел к успеху:
Я создал консольное приложение с простым main и включил остальную часть кода из моей оригинальной DLL. Ниже приведена упрощенная программа, которая включает в себя DLL:
namespace FIT.DLLTest
{
public class DLLTest
{
[STAThread]
static void Main(string[] args)
{
int a = 1;
}
public DLLTest()
{
int b = 17;
}
public int Add(int int1, int int2)
{
return int1 + int2;
}
}
}
после компиляции я переименовал созданный .exe к a .файл DLL.
в материнской программе, которая использует DLL, я сначала добавил DLLTest.dll в качестве ссылки, затем я добавил код выполните DLL.
namespace TestDLLTest
{
class TestDLLTest
{
static void Main(string[] args)
{
AppDomain domain = AppDomain.CreateDomain( "DLLTest" );
domain.ExecuteAssembly( "DllTest.dll" );
DLLTest dt = new DLLTest();
int res2 = dt.Add(6, 8);
int a = 1;
}
}
}
Violà я мог бы выполнить и добавить точку останова в DLLTest.Main метод и посмотреть, что я могу вызвать Main из DLLTest. Спасибо за обсуждение, ребята!
короткий ответ-нет. ля. DLL-файл представляет собой динамически связанную библиотеку, которая вызывается другой библиотекой. Думаю, то, что сказал Кит, технически сработает.. вероятно, вы могли бы переименовать его в то, что вы хотите еще .txt или .pdf, пока вы запускаете приложение надлежащим образом. Главный вопрос, который у меня есть: что вы пытаетесь сделать?? Если вы не пытаетесь написать вредоносное ПО, зачем вам это делать? Не то, чтобы я потворствовал написанию вредоносных программ для плохих целей, но я знаю люди любят экспериментировать в собственной лаборатории, поэтому я не осуждаю это. Если вы пишете вредоносное ПО, что-то вроде c++, C или assembler, может быть, лучше, я думаю, что C# может выполнить работу, но meh...