none
Как для tlbImp указать нужную целевую платформу .NET? RRS feed

  • Вопрос

  • Доброго времени суток.

    • .Net Framework 2.0 - 4.5
    • IDE MS VS 2005-2012
    • Windows 7 x64

    Мне нужно создать управляемую оболочку для TLB файла. Результат должен быть представлен в виде DLL файла платформы .NET 3.5. Однако по умолчанию этот файл создаётся для .NET 4.0. Как мне указать нужную целевую версию платформы .NET?

    Создаю оболочку так

    tlbimp "C:\SDK\Autodesk\AutoCAD\ObjectARX 2010\inc-x64\acax18ENU.tlb" /out:"C:\SDK\Autodesk\AutoCAD\ObjectARX 2010\inc-x64\acax18ENU.Interop.dll" /namespace:AutoCAD /machine:x64

    Здесь смотрел возможные ключи, однако не вижу опции, с помощью которой можно было бы указать версию целевой платформы .NET. Пробовал использовать tlbimp как из инструментов IDE 2010, так и из инструментов IDE 2012 - результат тот же.

    Если воспользоваться tlbimp из инструментов MS VS 2008, то создаётся DLL для нужной мне целевой платформы .NET. Однако мне очень не нравится такая зависимость от версии IDE...

    Как сгенерировать обёртку для нужной мне версии платформы .NET средствами MS VS 2010 и 2012?

    Спасибо.




    14 марта 2014 г. 10:22

Ответы

  • Такая ошибка возникает, если библиотека типа с указанным LIBID не зарегистрирована в реестре. Видимо tlbimp.exe это игнорирует, а VS - нет. Регистрация в любом случае необходима, т.к. в процессе запуска приложения (или того, что Вы создаете) возникнет ошибка загрузки незарегистрированного компонента COM, на который есть ссылки.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    18 марта 2014 г. 10:26

Все ответы

  • ну если вдруг никто не ответит, или вы не найдете ответа, попробуйте удалить NET 4, поставить 3.5, обернуть, а потом  четверку вернуть назад
    14 марта 2014 г. 11:41
  • не вариант. Выше я указал, какие платформы у меня установлены. Так же указал, что получил нужную мне обёртку, воспользовавшись tlbimp из IDE 2008. Однако вопрос по прежнему актуален.
    14 марта 2014 г. 11:47
  • Программа tlbimp.exe сама является приложением .net и для генерации управляемой обертки библиотеки типа использует классы .net framework. Думаю, что это и определяет целевую среду исполнения: классы .NET FW 3.5 формируют сборку для 3.5, а классы 4.0 свою.

    Хотя VS каким-то образом автоматически формирует обертку для той целевой платформы, которая соответствует версии FW проекта.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    14 марта 2014 г. 13:59
  • из SO

    вставить

    <startup>
       <supportedRuntime version="v2.0.50727"/>
    </startup>

    в

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp.exe.config



    14 марта 2014 г. 14:02
  • В этом каталоге и лежит версия программы для .net 3.5. Ей никакая дополнительная настройка не требуется.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    15 марта 2014 г. 19:47
  • в C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin лежит бинарный как раз под .NET.v4. это подтверждает

    <?xml version ="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
        </startup>
    </configuration>

    в папке \NETFX 4.0 Tools\sn.exe.config

    а под NET.v3.5 скорей всего в C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0\

    1. прописать в C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\tlbimg.exe.config

    <?xml version ="1.0"?>
    <configuration>
        <runtime>
            <generatePublisherEvidence enabled="false"/>

        </runtime>

    <startup>
      
    <supportedRuntime version="v2.0.50727"/>
    </startup>

    </configuration>


    2. или использовать директорию C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0\

    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);


    16 марта 2014 г. 8:17
  • в C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin лежит бинарный как раз под .NET.v4. это подтверждает

    У меня иное содержимое этого файла. Указание целевой платформы в конфигурационном файле не помогли. Подробнее написал об этом здесь.
    16 марта 2014 г. 17:07
  • Не понимаю, почему Вы вообще решили пользоваться утилитами командной строки. Проект, использующий эту обертку, Вы же все равно компилируете в VS. Ну и создайте обертку непосредственно в VS. Или у Вас другой сценарий разработки?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 марта 2014 г. 16:24
  • Изначально проблема описана здесь. Для AutoCAD 2009 я пишу .net плагины с использованием MS VS 2012-2013. Указанная IDE для TLB генерирует (при помощи tlbimp.exe) файлы DLL в формате .net 4.0. Однако AutoCAD 2009 может использовать только .NET 2.0-3.5. Отсюда и растёт обозначенная мною в данной теме проблема. Вручную она решаема, как я уже отписался выше: используя tlbimp.exe от MS VS 2008 я получил то, что мне нужно. Однако хотелось бы получать такой же результат и для более новых версий tlbimp.exe

    17 марта 2014 г. 16:27
  • а если обновить AutoCAD до версии выше


    17 марта 2014 г. 17:08
  • не вариант.
    17 марта 2014 г. 17:15
  • AutoCAD у меня нет, но с другими TLB-файлами ситуация следующая: ссылка на обертку библиотеки типа автоматически меняет target runtime в соответствии с конечной платформой проекта после того, как проект ПОЛНОСТЬЮ пересобрать. Причем, нужно указывать в качестве конечной платформы проекта именно x86 или x64 (но не 'Any CPU').

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 марта 2014 г. 17:15
  • Виноват, оговорился. Не Target Runtime, а Platform Target.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    17 марта 2014 г. 17:16
  • как я понял, вы хотите использовать AutoCAD2009, создавать на нем плагины на VisualStudio2012-13(используя новые возможности) на платформе NETv.4-4.5(используя новые возможности), с помощью tlbimg(которая собирает под самую новую версию NET которая установлена на системе)

    тут некий компромисс.

    если вам не удастся заставить студию собирать на CLR 2 то самое явное решение, удалить net4 или...обновить автокад. тут больше нечего добавить


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);


    17 марта 2014 г. 17:56
  • вы неправильно поняли. Я использую указанные IDE для программирования не только плагинов под AutoCAD 2009, но и для разработки отдельных приложений (их компилирую под 4.0). Когда же мне нужно компилировать очередной плагин под AutoCAD 2009 - я в проекте указываю .NET 3.5 в качестве целевой платформы, как это обычно и делается в подобных случаях.

    17 марта 2014 г. 18:09
  • AutoCAD у меня нет, но с другими TLB-файлами ситуация следующая: ссылка на обертку библиотеки типа автоматически меняет target runtime в соответствии с конечной платформой проекта после того, как проект ПОЛНОСТЬЮ пересобрать. Причем, нужно указывать в качестве конечной платформы проекта именно x86 или x64 (но не 'Any CPU').

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    В моём случае не имеет значения, какая целевая платформа указана: мне не удаётся подключить TLB файл к проекту во всех трёх случаях. Указанная проблема возникает в AutoCAD 2010 (по факту мои пользователи используют 2009-й, но я компилирую сразу под 2009-2014, дабы в случае перехода на любую более новую версию, всё прошло быстро и гладко). Показываю скрин проблемы:

    В других версиях AutoCAD этого не происходит - там всё проходит успешно. Так же проблему удаётся решить, как я уже писал выше, если вручную воспользоваться tlbimp.exe из более ранних версий Windows SDK.


    18 марта 2014 г. 7:32
  • Такая ошибка возникает, если библиотека типа с указанным LIBID не зарегистрирована в реестре. Видимо tlbimp.exe это игнорирует, а VS - нет. Регистрация в любом случае необходима, т.к. в процессе запуска приложения (или того, что Вы создаете) возникнет ошибка загрузки незарегистрированного компонента COM, на который есть ссылки.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    18 марта 2014 г. 10:26
  • Такая ошибка возникает, если библиотека типа с указанным LIBID не зарегистрирована в реестре. Видимо tlbimp.exe это игнорирует, а VS - нет. Регистрация в любом случае необходима, т.к. в процессе запуска приложения (или того, что Вы создаете) возникнет ошибка загрузки незарегистрированного компонента COM, на который есть ссылки.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    Сейчас проверить нет возможности (нет под рукой AutoCAD 2010). Вечером дома, на виртуальной машинке смогу потестировать. О результатах сообщу.

    Спасибо.

    18 марта 2014 г. 13:43