Автоматически создавать класс оболочки C# из dll в Visual Studio 2010 Express?

мне сказал мой коллега, что Visual Studio позволяет указывать на .dll и автоматически генерирует класс-оболочку C#. Это действительно возможно? И если да, то как достичь этого? Я просмотрел интернет, но не смог ничего придумать!

спасибо всем!


подумал, что я поделюсь этими ресурсами, а также,

3 ответов


3 случаях:

  1. DLL представляет управляемую сборку => вы непосредственно ссылаетесь на нее в своем проекте и используете ее
  2. DLL представляет COM-объект => вы можете использовать tlbimp.exe утилита для создания управляемой оболочки
  3. DLL представляет собой неуправляемую библиотеку с некоторыми экспортированными функциями. Это самое сложное. Нет никаких инструментов. Чтобы узнать имена экспортируемых функций, вам придется обратиться к документации библиотеки и параметры и сборки управляемых оболочек P / Invoke. Вы можете использовать команду dumpbin.exe утилита для просмотра списка экспортируемых функций. Вот!--12-->статьи на MSDN о различных шагах.

Это, безусловно, невозможно с любой DLL. Просто очень специфический вид, который реализует COM-сервер. Конвертеру необходимо хорошее описание экспортируемых типов, которое предоставляется для таких серверов с помощью библиотеки типа.

библиотека типов является точным эквивалентом метаданных в управляемой сборке. В то время как он начинает жизнь как отдельный файл, a .TLB-файл, он часто внедряется в качестве ресурса в DLL. Хорошее место для этого, держит тип описания близко к коду, который его реализует. Так же, как метаданные в сборке .NET.

некоторые инструменты для просмотра библиотек типов (не уверен, работает ли он в Express): в Visual Studio используйте File + Open + File и выберите, скажем, c:\windows\system32\shell32 - ... файл DLL. Вы увидите ресурсы в этой DLL, обратите внимание на узел TYPELIB. Это библиотека типов. Это двоичный файл, поэтому на самом деле чтение это не практично. Для этого запустите OleView.exe из командной строки Visual Studio. Файл + просмотр Typelib и выберите ту же DLL. Это декомпилирует библиотеку типов обратно в IDL, язык описания интерфейса, который первоначально использовался для создания библиотеки типов. Хорошо читаемый, у вас будет немного проблем с пониманием языка. И можно легко увидеть, как .NET Tlbimp.exe может перевести эту библиотеку типов в эквивалентные объявления C#.

библиотеки типов старые, они существуют с 1996 года. Первоначально разработанный командой Visual Basic в Microsoft в качестве замены VBX, 16-разрядная модель расширяемости VB. Они были очень удачный, практически любой компилятор Windows поддерживает их. Но они ограничены в выразительной силе, нет поддержки таким вещам, как дженерики и наследование реализации. Примечательно, что команда Windows 8 заменила библиотеки типов для WinRT. Они выбрали формат метаданных .NET.


Я знаю, что этот вопрос довольно старый и, кажется, получил достаточный ответ, но я просто хочу добавить одну мысль, которая, по-моему, может быть важна. Я могу ошибаться, поэтому, пожалуйста, примите мой ответ с солью и поправьте меня, если я ошибаюсь.

чтобы иметь возможность вызывать члены / поля в DLL, информация, необходимая для их вызова, должна быть доступна в некоторой форме. Эта информация должна быть всем, что вам нужно, чтобы написать обертку. С помощью этого вы можете определить все члены / поля "форма" aka заголовки методов и так далее.

В C# можно загрузить DLL через отражение и получить эту информацию. Я не знаю о разных типах DLL, как описано выше, но, как я уже сказал, для вызова членов/полей эта информация должна быть там в какой-то форме. Поэтому, используя отражение для получения этой информации, вы можете создать новый класс, например "prefixOriginalname" , и иметь те же члены / поля, что и ваш исходный класс, вызывая члены / поля вашего исходного класса и добавление желаемой дополнительной функциональности.

Так

  1. каждая DLL (или периферийный документ) дает вам информацию, необходимую для использования ее типов. А именно все, что реализовано как "публичное"
  2. вы можете получить доступ к необходимой информации посредством отражения
  3. учитывая 1. и 2., вы можете создать программу для извлечения необходимой информации из DLL и создания оболочек соответственно.

Как я уже сказал, Я не на 100% уверен в этом, потому что другие ответы заставляют меня думать, что это может быть слишком сложно или даже невозможно по какой-то причине.