Managed dll использование
От: carpenter Голландия  
Дата: 04.12.07 11:02
Оценка:
Собственно есть старенький проект на vc6 хочеться добавить некотрый функционал —
хочу сделать длл на шарпе и юзать ее из vc6 . собственно ддлку сделал но при
подключении типа — #import <test.dll> ругается — Cannot open type library file: 'test.dll': Ошибка при загрузке библиотеки.
дллка реализует только одну функцию и компилялась так — csc /target:library /out:test.dll test.cs
Поиском поискал вроде ничо не нашел — ткните пальцем пожалуйста
Спасибо
Весь мир — Кремль, а люди в нем — агенты
Re: Managed dll использование
От: Аноним  
Дата: 04.12.07 11:14
Оценка: -1
Здравствуйте, carpenter, Вы писали:


C>Собственно есть старенький проект на vc6 хочеться добавить некотрый функционал -

C>хочу сделать длл на шарпе и юзать ее из vc6 . собственно ддлку сделал но при
C>подключении типа — #import <test.dll> ругается — Cannot open type library file: 'test.dll': Ошибка при загрузке библиотеки.
C>дллка реализует только одну функцию и компилялась так — csc /target:library /out:test.dll test.cs

dll-ка "на шарпе" это не машинные коды вовсе, не сможешь ты таким макаром ее заюзать из vc6, зато можешь зарегать ее как COM и использлвать с этой стороны при желании...
Re[2]: Managed dll использование
От: carpenter Голландия  
Дата: 04.12.07 11:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, carpenter, Вы писали:




А> dll-ка "на шарпе" это не машинные коды вовсе,


Есть подозрение что там гдето есть машинные коды

А> не сможешь ты таким макаром ее заюзать из vc6, зато можешь зарегать ее как COM и использлвать с этой стороны при желании...




как СОМ нет желания (со стороны кода упрощения не получиться ) типа не стоит того
Весь мир — Кремль, а люди в нем — агенты
Re[3]: Managed dll использование
От: mrozov  
Дата: 04.12.07 14:10
Оценка: -1
C>Есть подозрение что там гдето есть машинные коды
Совершенно беспочвенное.
Машинные коды есть в runtime-е .net, который будет эту dll интерпретировать в машинные коды. Компрене ву?
Re[3]: Managed dll использование
От: blind_petrik  
Дата: 04.12.07 14:22
Оценка:
Здравствуйте, carpenter, Вы писали:

C>Есть подозрение что там гдето есть машинные коды


Почитайте Рихтера. В этой длл-ке машинных кодов и близко нет.
Re: Managed dll использование
От: _ils_  
Дата: 04.12.07 16:09
Оценка:
Здравствуйте, carpenter, Вы писали:



C>Собственно есть старенький проект на vc6 хочеться добавить некотрый функционал -

C>хочу сделать длл на шарпе и юзать ее из vc6 . собственно ддлку сделал но при
C>подключении типа — #import <test.dll> ругается — Cannot open type library file: 'test.dll': Ошибка при загрузке библиотеки.
C>дллка реализует только одну функцию и компилялась так — csc /target:library /out:test.dll test.cs
C>Поиском поискал вроде ничо не нашел — ткните пальцем пожалуйста
C>Спасибо

Попробуйте почитать здесь
Re: Managed dll использование
От: Norex Россия  
Дата: 04.12.07 21:02
Оценка:
Здравствуйте, carpenter, Вы писали:



C>Собственно есть старенький проект на vc6 хочеться добавить некотрый функционал -

C>хочу сделать длл на шарпе и юзать ее из vc6 . собственно ддлку сделал но при
C>подключении типа — #import <test.dll> ругается — Cannot open type library file: 'test.dll': Ошибка при загрузке библиотеки.
C>дллка реализует только одну функцию и компилялась так — csc /target:library /out:test.dll test.cs
C>Поиском поискал вроде ничо не нашел — ткните пальцем пожалуйста
C>Спасибо

Где-то в сети я встречал методу которая позволяла загружать managed code как native.
Как это сделать — нужно поискать, у меня где-то было, но суть была такая:
Компилируем managed .dll натравливаем на неё ldasm меняем какие-то флаги или чёт типа того и компилируем обратно.

Я попробовал проделать всё как написано и из native зделав LoadLibrary я отлично смог работать с managed .dll. Возможно там есть какие-то ограничения, но у меня работало.
Я даже написал GINA на C# подправив как было написало в статье Windows XP Pro отлично приняла её за native.

Если уж очень инетерстно, я поищу у себя.
Re[2]: Managed dll использование
От: Аноним  
Дата: 05.12.07 07:20
Оценка:
Здравствуйте, Norex, Вы писали:

N>Где-то в сети я встречал методу которая позволяла загружать managed code как native.

N>Как это сделать — нужно поискать, у меня где-то было, но суть была такая:
N>Компилируем managed .dll натравливаем на неё ldasm меняем какие-то флаги или чёт типа того и компилируем обратно.

N>Я попробовал проделать всё как написано и из native зделав LoadLibrary я отлично смог работать с managed .dll. Возможно там есть какие-то ограничения, но у меня работало.

N>Я даже написал GINA на C# подправив как было написало в статье Windows XP Pro отлично приняла её за native.

N>Если уж очень инетерстно, я поищу у себя.


Очень интересно было бы на это глянуть.
Re[4]: Managed dll использование
От: carpenter Голландия  
Дата: 05.12.07 09:48
Оценка:
Здравствуйте, blind_petrik, Вы писали:

_>Здравствуйте, carpenter, Вы писали:


C>>Есть подозрение что там гдето есть машинные коды


_>Почитайте Рихтера. В этой длл-ке машинных кодов и близко нет.


Извините был неправ ... погорячился
Весь мир — Кремль, а люди в нем — агенты
Re[2]: Managed dll использование
От: carpenter Голландия  
Дата: 05.12.07 09:51
Оценка:
Здравствуйте, Norex, Вы писали:

N>Здравствуйте, carpenter, Вы писали:



N>Если уж очень инетерстно, я поищу у себя.


Интересно
Весь мир — Кремль, а люди в нем — агенты
Re[4]: Managed dll использование
От: _Morpheus_  
Дата: 12.12.07 18:22
Оценка: -1
Здравствуйте, blind_petrik, Вы писали:

C>>Есть подозрение что там гдето есть машинные коды


_>Почитайте Рихтера. В этой длл-ке машинных кодов и близко нет.


в DLL'ке машинные коды есть, эти коды состоят из передачи управления в CLR, во время этого вызова CLR компилит IL код в машинный и передает управление ему, т.е. по сути хоть код в DLL на IL, но он при загрузке DLL (LoadLibrary) незаметно превращается в машинные коды
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: Managed dll использование
От: _Morpheus_  
Дата: 12.12.07 18:37
Оценка: -1
Т.е. хотя managed DLL физически и не содержит внутри файла машинные коды экспортируемых методов, но машинный код они всетаки содержат, а на то что кода методов физически в файле не существует можно не обращать внимания, т.к. в момент первого вызова сработает машинный код вызова компиляции этого метода, который сформирует машинный код и будет произведена подмена вызова компиляции на вызов машинного кода метода.
Короче для программиста managed DLL особо ничем не отличается от обычной unmanaged. Единственное НО — есть подводные камни, связанные с использованием managed DLL написанных на разных версиях дотнет фреймворка... подводные камни связаны с тем, что в одном процессе нельзя использовать несколько фреймворков, т.е. нельзя одновременно загружать в процесс несколько DLL написанных на разных фреймворках.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: Managed dll использование
От: mrozov  
Дата: 13.12.07 09:23
Оценка: -1
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, blind_petrik, Вы писали:


C>>>Есть подозрение что там гдето есть машинные коды


_>>Почитайте Рихтера. В этой длл-ке машинных кодов и близко нет.


_M_>в DLL'ке машинные коды есть, эти коды состоят из передачи управления в CLR, во время этого вызова CLR компилит IL код в машинный и передает управление ему, т.е. по сути хоть код в DLL на IL, но он при загрузке DLL (LoadLibrary) незаметно превращается в машинные коды


Детский сад. И что? И какое это имеет отношение к обсуждаемому вопросу? Ты как всегда в своем репертуаре.
Re[6]: Managed dll использование
От: mrozov  
Дата: 13.12.07 09:52
Оценка: -1
Здравствуйте, _Morpheus_, Вы писали:

_M_>Т.е. хотя managed DLL физически и не содержит внутри файла машинные коды экспортируемых методов, но машинный код они всетаки содержат,

Ну, то есть ты обнаружил, что какие-то unmanaged коды там есть? И на основании этого ... нда....

_M_>а на то что кода методов физически в файле не существует можно не обращать внимания,

На здравый смысл, я так понимаю, тоже
_M_>т.к. в момент первого вызова сработает машинный код вызова компиляции этого метода, который сформирует машинный код и будет произведена подмена вызова компиляции на вызов машинного кода метода.
Вызова чего, комрад? Откуда этот вызов возьмется?

_M_>Короче для программиста managed DLL особо ничем не отличается от обычной unmanaged.


Ржу пад сталом!

Ничем, кроме того, что использовать ее из-под unmanaged кода можно, фактически (если не предпринимать подвигов а-ля Геракл), только через взаимодействие посредством com-а. А так больше ничем не отличается, совершенно.

То-то и оно, что без загрузки .net runtime-а managed dll — это dll только формально.
Re[7]: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 10:50
Оценка: 1 (1) -1
Здравствуйте, mrozov, Вы писали:

_M_>>Короче для программиста managed DLL особо ничем не отличается от обычной unmanaged.

M>
M>Ржу пад сталом!

трава хорошая?

Когда ржачь пройдет и начнут работать мозги (если они есть), открой дизассемблером дотнетную сборку

ты увидишь что машинный код там есть:
EntryPoint:
    JMP    [mscoree!_CorExeMain]



это вызов который скомпилирует IL код в машинный и передаст ему управление. Аналогичный вызов будет стоять на всех точках входа экспортируемых функций.
После этого этот джамп будет заменен реальным машинным кодом. Если не заглядывать во внутренности DLL, то разницы в ее использовании, за исключением проблемы с версиями фреймворка, по сравнению с обычной DLL нет.

А перед тем как ржать и ставить минусы, почитай хотябы Рихтера чтобы не писать глупости.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[6]: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 10:52
Оценка: -1
Здравствуйте, mrozov, Вы писали:

M>Детский сад. И что? И какое это имеет отношение к обсуждаемому вопросу? Ты как всегда в своем репертуаре.


Самое непосредственное. Человека интересовало можно ли экспортировать функции из дотнет сборки, как в обычной DLL, ответ ДА, МОЖНО!
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[7]: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 11:06
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>Здравствуйте, mrozov, Вы писали:


M>>Детский сад. И что? И какое это имеет отношение к обсуждаемому вопросу? Ты как всегда в своем репертуаре.


_M_>Самое непосредственное. Человека интересовало можно ли экспортировать функции из дотнет сборки, как в обычной DLL, ответ ДА, МОЖНО!


Подробное описание решения, которое нужно топикстартеру я уже писал здесь
Автор: _Morpheus_
Дата: 04.05.07
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[3]: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 11:10
Оценка:
Здравствуйте, carpenter, Вы писали:

N>>Если уж очень инетерстно, я поищу у себя.


C>Интересно


тут
Автор: _Morpheus_
Дата: 04.05.07
я уже описывал решение
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[8]: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 11:51
Оценка:
Вот конкретный пример, расписанный по шагам, который по мнению morozov принципиально невозможен и вызывает у него приступ "ржания"

1. Делаем managed DLL test.dll с таким кодом:
using System;

class Library
{
    public static void DoWork()
    {
        Console.WriteLine("Hello from managed DLL!");
    }
}


2. Дизассемблируем его:
ildasm test.dll /linenum /out:test.il


в результате получаем два файла test.il и test.res

3. Открываем файл test.il и вносим такие изменения (то что нужно изменить выделено жирным):
// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly test
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
                                                                                                             63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
  .hash algorithm 0x00008004
  .ver 0:0:0:0
}

.module test.dll
// MVID: {BDE64ED3-8F63-4249-9A0E-D8244DA3ED57}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000002    //  ILONLY поменяли на 32BITREQUIRED
// Image base: 0x00F20000


// Добавляем таблицу экспорта для одной функции:
.data VT_01 = int32[1]
.vtfixup [1] int32 fromunmanaged at VT_01




// =============== CLASS MEMBERS DECLARATION ===================

.class private auto ansi beforefieldinit Library
       extends [mscorlib]System.Object
{
  .method public hidebysig static void  DoWork() cil managed
  {
    // Code size       13 (0xd)
    .maxstack  8

    
        // Отмечаем что метод DoWork нужно экспортировать
        .vtentry 1:1
    .export [1] as DoWork


    IL_0000:  nop
    IL_0001:  ldstr      "Hello from managed DLL!"
    IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000b:  nop
    IL_000c:  ret
  } // end of method Library::DoWork

  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    // Code size       7 (0x7)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    IL_0006:  ret
  } // end of method Library::.ctor

} // end of class Library


4. компилируем обратно:
ilasm /dll test.il /out:test.dll /res:test.res /quiet



Это все, теперь протестируем как работает managed DLL из unmanaged кода...

Делаем программу на C:

unmanaged.c:
#include <windows.h>

typedef void (*DoWorkPtr)();

void main()
{
    HMODULE dll = LoadLibrary("test.dll");
    DoWorkPtr DoWork = (DoWorkPtr)GetProcAddress(dll, "DoWork");

    DoWork();

    FreeLibrary(dll);
}


компилируем, запускаем, получаем результат:
Hello from managed DLL!


Как видим все прекрасно работает из unmanaged кода, и при этом обращение к managed DLL ничем не отличается от от обращения к unmanaged DLL — код тотже самый.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re: Managed dll использование
От: _Morpheus_  
Дата: 13.12.07 12:02
Оценка:
Здравствуйте, carpenter, Вы писали:

C>Собственно есть старенький проект на vc6 хочеться добавить некотрый функционал -

C>хочу сделать длл на шарпе и юзать ее из vc6 . собственно ддлку сделал но при
C>подключении типа — #import <test.dll> ругается — Cannot open type library file: 'test.dll': Ошибка при загрузке библиотеки.
C>дллка реализует только одну функцию и компилялась так — csc /target:library /out:test.dll test.cs
C>Поиском поискал вроде ничо не нашел — ткните пальцем пожалуйста
C>Спасибо

смотри тут
Автор: _Morpheus_
Дата: 13.12.07
... << RSDN@Home 1.2.0 alpha rev. 676>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.