AutoCAD и версия .Net Framework

Дата публикации: 21.12.2010
Состояние: завершена
Дата последнего редактирования: 4.02.2011 (внёс ряд правок в оформление, добавил несколько пояснений).

    Содержимое конфигурационного файла AutoCAD 2009 по умолчанию является следующим:

   1:  <configuration>
   2:     <startup>
   3:  <!--We always use the latest version of the framework installed on the computer. If you
   4:  are having problems then explicitly specify .NET 2.0 by uncommenting the following line.-->
   5:          <!--<supportedRuntime version="v2.0.50727"/>-->
   6:     </startup>
   7:  <!--All assemblies in AutoCAD are fully trusted so there's no point generating publisher evidence-->
   8:     <runtime>        
   9:         <generatePublisherEvidence enabled="false"/>
  10:     </runtime>
  11:  </configuration>

    В строках 3-4 разработчики Autodesk пишут, что в AutoCAD они всегда используют самую последнюю версию .Net Framework, установленную на локальном компьютере (если не раскомментирован элемент supportedRuntime  и для него не указана иная версия платформы), но так ли это на самом деле? Как показывает практика - это не всегда так... Например AutoCAD 2009 не в состоянии работать с .Net Framework 4.0 (самая новая версия платформы на сегодняшний день) и при настройках, указанных выше, использует версию 3.5. Убедиться в этом очень просто - давайте вместе сделаем это...

Первый шаг

    Скомпилируем исходный код любого, имеющегося под рукой .Net-плагина AutoCAD, используя при этом в качестве целевой - платформу .Net Framework 4.0. Загрузим полученную в результате компиляции библиотеку в наш AutoCAD 2009 (командой _NetLoad)... В командной строке AutoCAD мы увидим нечто подобное: 

Command: netload
Cannot load assembly. Error details: System.BadImageFormatException: Could not
load file or assembly 'file://\\hyprostroy\dfs\groups\Отдел
IT\@Bush\DotNet\ClassDotNet4Acad2009\ClassDotNet4Acad2009\bin\Debug\ClassDotNet4
Acad2009.dll' or one of its dependencies. This assembly is built by a runtime
newer than the currently loaded runtime and cannot be loaded
.
File name: 'file://\\hyprostroy\dfs\groups\Отдел
IT\@Bush\DotNet\ClassDotNet4Acad2009\ClassDotNet4Acad2009\bin\Debug\ClassDotNet4
Acad2009.dll'
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase,
Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark,
Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,
Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoadFrom(String assemblyFile, Evidence
securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm,
Boolean forIntrospection, StackCrawlMark& stackMark)
at System.Reflection.Assembly.LoadFrom(String assemblyFile)
at Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
at loadmgd()

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value
[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure
logging.
To turn this feature off, remove the registry value
[HKLM\Software\Microsoft\Fusion!EnableLog].

    Обратите внимание на текст, выделенный красным цветом - в нём говорится, что загружаемая нами сборка собрана в более новой версии .Net Framework чем та, которая используется AutoCAD 2009 в рамках текущей сессии. Если бы он (AutoCAD) использовал .Net 4.0 - такого сообщения бы не было.

Второй шаг

    Давайте попробуем принудительно указать использование версии 4.0. Для этого изменим config-файл следующим образом:

   1:  <configuration>
   2:     <startup>
   3:  <!--We always use the latest version of the framework installed on the computer. If you
   4:  are having problems then explicitly specify .NET 2.0 by uncommenting the following line. -->
   5:          <supportedRuntime version="v4.0.30319"/>
   6:     </startup>
   7:  <!--All assemblies in AutoCAD are fully trusted so there's no point generating publisher evidence-->
   8:     <runtime>        
   9:         <generatePublisherEvidence enabled="false"/>
  10:     </runtime>
  11:  </configuration>

    Запускаем AutoCAD 2009 и повторно пытаемся загрузить наш .net-плагин, скомпилированный под .net 4.0. В результате получаем тот же самый набор сообщений, который показан мною выше. Т.е. принудительное указание использования платформы .Net Framework 4.0 действия не возымело.

Третий шаг

    Последний шаг в нашем тестировании: удаляем все версии .Net Framework, установленные на локальном компьютере, оставляя только версию 4.0. Восстанавливаем конфигурационный файл AutoCAD 2009 в исходное состояние (комментируем строку 5).

    После этого для начала запускаем любое тестовое консольное приложение, скомпилированное под .Net 4.0 - для того, чтобы убедиться, что оно работает (т.е. .Net Framework 4.0 на месте и фунциклирует):


    Теперь запускаем наш AutoCAD 2009, в результате чего получаем это:

Вывод:

    Т.о. основываясь на всём вышеизложенном, используя в качестве примера AutoCAD 2009 и .Net Framework 4.0, можно сделать вывод, что не каждая версия AutoCAD сможет использовать последнюю версию .Net Framework из имеющихся на вашей машине.

Comments