Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
Micro
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 436
1

DLL с точкой входа

15.08.2013, 02:15. Просмотров 2808. Ответов 4
Метки нет (Все метки)

Хочу сделать библу, чтобы при подгрузке выполнялась главная функция. Так же как в С++ DllMain().
Библиотека будет загружаться в сторонний процесс специальным инжектором. Много чего перерыл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2013, 02:15
Ответы с готовыми решениями:

Не удается найти точку входа "WMS_Open" в DLL "Pc.Shared.Barcode.dll"
Добрый день. У меня проблема с распознаванием штрих-кода (библиотеками...

Создание точки входа в DLL
Знаю что нельзя. :-/ Но это не дает мне покоя, вручную вызывать какой-то метод...

Не удается найти точку входа в dll
Здравствуйте! Помогите разобраться пожалуйста. Пишу DLL'ку: .cpp файл ...

Не удается найти точку входа в Dll
Добрый день. Помогите пожалуйста не знаю что делать. У меня есть библиотека...

BSOD при попытке входа в метод C#-dll
Добрый день! Надеюсь, эта тема будет интересна для вас. Есть dll (сервер),...

4
Psilon
Master of Orion
Эксперт .NET
6001 / 4851 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
15.08.2013, 02:20 2
dllmain на C#
0
Micro
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 436
15.08.2013, 02:24  [ТС] 3
Смотрел. Не то

Добавлено через 1 минуту
Тут у человека все заработало, но решения он не написал.
0
NickoTin
Почетный модератор
Эксперт .NET
8448 / 3570 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
15.08.2013, 02:36 4
Micro, там (на античате) ответил не ТС о том что всё заработало.
Заработал там код инжекта нативной библиотеки, заинжектить чистую .NET библиотеку написанную на C# не получится без вспомогательных средств. C++\CLI библиотека грузится, но использовать управляемый код при загрузке неправильно и чревато нестабильным поведением приложения (link).
1
Micro
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 436
15.08.2013, 12:34  [ТС] 5
Нашел пример. Переделал под себя, но не хочет работать никак.
DLL C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
 
#include "MSCorEE.h"
 
#pragma comment(lib, "mscoree.lib")
 
 
void DllThread()
{
    ICLRRuntimeHost* pCLR = NULL;
    DWORD result;
       // start the .NET Runtime in the current native process
    CorBindToRuntimeEx(NULL, L"wks", NULL, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&pCLR);
    pCLR->Start();
       // execute the method "Int32 Test.Program.InjectedMain(String arg)"
    pCLR->ExecuteInDefaultAppDomain(L"C:\\ClassLibrary1.dll", L"ClassLibrary1.Class1", L"Main", L"", &result);
 
 
 
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  reason, LPVOID lpReserved )
{
    if (reason == DLL_PROCESS_ATTACH)
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)DllThread, NULL, NULL, NULL);
    return TRUE;
}
Код моей библы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace ClassLibrary1
{
    public class Class1
    {
        [DllImport("user32.dll", SetLastError = true)]
 
        public static extern int MessageBoxW(int hWnd, String text, String caption, uint type);
 
        public static void Main()
        {
            MessageBoxW(0, "asd", "asd", 4);
            MessageBox.Show("test");
        }
    }
}
Инжект идет, моя длл не работает

Добавлено через 17 минут
Нашел рабочий код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include <metahost.h>
#include <mscoree.h>
#pragma comment(lib, "mscoree.lib")
 
 
ICLRRuntimeHost* GetRuntimeHost(LPCWSTR dotNetVersion)
{
    ICLRMetaHost* metaHost = NULL;
    ICLRRuntimeInfo* info = NULL;
    ICLRRuntimeHost* runtimeHost = NULL;
 
    // Get the CLRMetaHost that tells us about .NET on this machine
    if (S_OK == CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&metaHost))
    {
        // Get the runtime information for the particular version of .NET
        if (S_OK == metaHost->GetRuntime(dotNetVersion, IID_ICLRRuntimeInfo, (LPVOID*)&info))
        {
            // Get the actual host
            if (S_OK == info->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*)&runtimeHost))
            {
                // Start it. This is okay to call even if the CLR is already running
                runtimeHost->Start();
            }
        }
    }
    if (NULL != info)
        info->Release();
    if (NULL != metaHost)
        metaHost->Release();
 
    return runtimeHost;
}
 
 
int ExecuteClrCode(ICLRRuntimeHost* host, LPCWSTR assemblyPath, LPCWSTR typeName,
    LPCWSTR function, LPCWSTR param)
{
    if (NULL == host)
        return -1;
 
    DWORD result = -1;
    if (S_OK != host->ExecuteInDefaultAppDomain(assemblyPath, typeName, function, param, &result))
        return -1;
 
    return result;
}
 
void execute()
{
    ICLRRuntimeHost* host = GetRuntimeHost(L"v4.0.30319");
    ExecuteClrCode(host , L"C:\\ClassLibrary1.dll", L"ClassLibrary1.Class1", L"Main", L"");
    // At some point you will need to call Release(). You can do it now or during cleanup code
    host->Release();
 
}
 
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)execute, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
0
15.08.2013, 12:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 12:34

Как при создании своей dll подключить туда сторонние dll
Здравствуйте, я работаю в связке C# - Oracle. Если коротко, то вопрос звучит...

Зачем к dll прилагаются файлы: .dll.config, .pdb, .xml
Здравствуйте, Я начал изучать OpenGL 3.3 в C# с помощью OpenTK. Работаю в...

Как вложить в одну dll еще несколько скомпилированных dll
Всем привет, подскажите пожалуйста, как в проект библиотеки классов вложить еще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru