<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>Комментарии на: .NET-сборки для AutoCAD разных версий, часть 2</title>
	<atom:link href="https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/feed/" rel="self" type="application/rss+xml" />
	<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/</link>
	<description>LISP для AutoCAD</description>
	<lastBuildDate>Tue, 24 Feb 2026 16:11:05 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0</generator>
	<item>
		<title>От: Андрей</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-55941</link>
		<dc:creator><![CDATA[Андрей]]></dc:creator>
		<pubDate>Mon, 13 Apr 2015 13:34:43 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-55941</guid>
		<description><![CDATA[Так, в поисках нужного pdf-файла наткнулся на эту заметку. Сразу, пока помню - вот мои мультики по обозначенной теме:

первый: https://www.youtube.com/watch?v=Xm3vgnsju0s
второй: https://www.youtube.com/watch?v=Iey1REsvYrw
третий: https://www.youtube.com/watch?v=4zjJXHpDYe4]]></description>
		<content:encoded><![CDATA[<p>Так, в поисках нужного pdf-файла наткнулся на эту заметку. Сразу, пока помню - вот мои мультики по обозначенной теме:</p>
<p>первый: <a href="https://www.youtube.com/watch?v=Xm3vgnsju0s" rel="nofollow">https://www.youtube.com/watch?v=Xm3vgnsju0s</a><br />
второй: <a href="https://www.youtube.com/watch?v=Iey1REsvYrw" rel="nofollow">https://www.youtube.com/watch?v=Iey1REsvYrw</a><br />
третий: <a href="https://www.youtube.com/watch?v=4zjJXHpDYe4" rel="nofollow">https://www.youtube.com/watch?v=4zjJXHpDYe4</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Андрей</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-52167</link>
		<dc:creator><![CDATA[Андрей]]></dc:creator>
		<pubDate>Mon, 09 Jun 2014 17:13:05 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-52167</guid>
		<description><![CDATA[&lt;em&gt;&gt;Решение с директивами, как мне кажется, поднимает другой вопрос – понадобится а) менять версию .NET и б) менять выходной каталог. Лично я практически гарантирую, что рано или поздно что-нибудь да будет забыто.&lt;/em&gt;
Честно говоря, я не понял каким образом к директивам препроцессора относятся пункты &quot;а)&quot; и &quot;б)&quot;... Директивы препроцессора предназначены для выполнения &lt;strong&gt;условной компиляции&lt;/strong&gt;. Они никак не связаны ни с &quot;а)&quot;, ни с &quot;б)&quot;. Забыто ничего не будет, т.к. если что-то будет забыто, то тот проект, в котором ты что-то забыл, попросту не скомпилируется. При этом компилятор тебе точно покажет проблемное место. Многократно проверено на практике.]]></description>
		<content:encoded><![CDATA[<p><em>&gt;Решение с директивами, как мне кажется, поднимает другой вопрос – понадобится а) менять версию .NET и б) менять выходной каталог. Лично я практически гарантирую, что рано или поздно что-нибудь да будет забыто.</em><br />
Честно говоря, я не понял каким образом к директивам препроцессора относятся пункты "а)" и "б)"... Директивы препроцессора предназначены для выполнения <strong>условной компиляции</strong>. Они никак не связаны ни с "а)", ни с "б)". Забыто ничего не будет, т.к. если что-то будет забыто, то тот проект, в котором ты что-то забыл, попросту не скомпилируется. При этом компилятор тебе точно покажет проблемное место. Многократно проверено на практике.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Дима_</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51229</link>
		<dc:creator><![CDATA[Дима_]]></dc:creator>
		<pubDate>Tue, 24 Dec 2013 17:12:10 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51229</guid>
		<description><![CDATA[Насчет GetAcadVersion... Это Вы ребята &quot;круто&quot; загнули, ну вариант Крыса с учетом, что версии они могут переименовывать черт знает как - чтоб потом не вспоминать где тут, что - это еще куда не шло (не думая добавил проверку версии) - не красиво, но надежно, но у Андрея со словарями - это по моему перебор. Получить из одного другое - 1 формула на уровне 5-го класса - 1 строка (F# - на С# все то-же самое - просто под рукой нет, чтоб не напутать с операторами), еще строка перевода из строка-число-строка (а можно и в той-же написать).
let Test x=(x/10-17)*3+x%10+2007 - все]]></description>
		<content:encoded><![CDATA[<p>Насчет GetAcadVersion... Это Вы ребята "круто" загнули, ну вариант Крыса с учетом, что версии они могут переименовывать черт знает как - чтоб потом не вспоминать где тут, что - это еще куда не шло (не думая добавил проверку версии) - не красиво, но надежно, но у Андрея со словарями - это по моему перебор. Получить из одного другое - 1 формула на уровне 5-го класса - 1 строка (F# - на С# все то-же самое - просто под рукой нет, чтоб не напутать с операторами), еще строка перевода из строка-число-строка (а можно и в той-же написать).<br />
let Test x=(x/10-17)*3+x%10+2007 - все</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Andrey</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51205</link>
		<dc:creator><![CDATA[Andrey]]></dc:creator>
		<pubDate>Sun, 01 Dec 2013 18:26:49 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51205</guid>
		<description><![CDATA[Выкладываю обещанные мною замечания по программному коду:
1. На мой взгляд, нет особой необходимости в функции getAcadProfileName(), т. к. не составляет особого труда в коде напрямую проверять значение системной переменной. Хотя, пожалуй, это дело вкуса...
2. Функцию getAcadVersion я бы переписал так:
[cc lang=&quot;csharp&quot;]
public static String getAcadVersion(String coreVersion) {
    Int32 minMajor = 17;
    Int32 maxMajor = 19;
    Int32 year = 2007; // The start value is the year of the [minMajor].0 core version.
    Dictionary&lt;String, String&gt; dict = new Dictionary&lt;String, String&gt;();
    for (Int32 major = minMajor; major &lt;= maxMajor; ++major) {
        for (Int32 minor = 0; minor &lt; 3; ++minor) {
            dict.Add(String.Format(&quot;{0}.{1}&quot;, major, minor), year.ToString());
            ++year;
        }
    }
    String result = dict.ContainsKey(coreVersion) ? dict[coreVersion] : String.Empty;
    return result;
}
[/cc]
В коде я исхожу из предположения, что Autodesk не станет нарушать своё правило, согласно которому назначает нумерацию версий на протяжении уже многих лет. Если в будущем правило будет изменено, то в этот код потребуется внести учитывающие этот момент изменения.
Твой вариант с использованием case гораздо менее гибок, т. к. ты в нём жёстко зашил конкретные значения. Мой вариант вычисляет все значения автоматически. Позднее ты можешь изменить значение maxMajor на другое число, тем самым автоматически расширив диапазон вычисляемых значений.
3. Необходимости в функции getAcadVersionWithBit(), так же как и в функции getAcadProfileName() я не вижу, поскольку разрядность AutoCAD всегда та же, что и разрядность операционной системы. В виду этого разрядность можно определять так:
[cc lang=&quot;csharp&quot;]
String platform = IntPtr.Size == 4 ? &quot;x86&quot; : &quot;x64&quot;;
[/cc]
Объединять год с разрядностью, можно либо просто конкатенацией строк (что ты и делал в своём коде), либо следующим образом (предпочитаемый мною вариант):
[cc lang=&quot;csharp&quot;]
String.Format(&quot;{0}{1}&quot;, year, platform); // the &#039;year&#039; is String
[/cc]
4. Нет никакой необходимости в наличии функций getPathAppData() и getPathTemp(). Искомую информацию можно получить например так:
[cc lang=&quot;csharp&quot;]
String appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
String temp = Environment.ExpandEnvironmentVariables(&quot;%temp%&quot;);[/cc]
Посмотри перечисление Environment.SpecialFolder - много интересных вариантов найдёшь, а с помощью Environment.ExpandEnvironmentVariables всегда можно развернуть строку, содержащую в своём составе имя системной переменной.
Примечание: Кстати, эти способы повсеместно используются в моём коде на старом сайте, странно, что ты этого не видел, если конечно вообще смотрел мой код...
5. Ты создал два CS-файла: TextObjects2009.cs и TextObjects2013.cs содержимое которых отличается всего лишь несколькими строчками. Т. о. налицо дублирование существенного объема кода и в случае, если тебе потребуется вносить изменения в код - это придётся делать два раза (или столько, сколько ты создашь почти идентичных CS-файлов), о чём я тебе уже писал ранее по Skype.

При этом нужно будет стараться не забыть внести ВСЕ изменения, не пропустив ничего, что порой может быть затруднительно, если изменений было много, а тебя на работе отвлекают, время от времени - есть немалый шанс что-то пропустить.

Именно поэтому следует использовать директивы препроцессора. Покажу это на переделанном мною примере одного твоего метода (остальные делаются по аналогии):
[cc lang=&quot;csharp&quot;]
#define newer_than_2009 // Comment this row for AutoCAD 2009 and older
using Db = Autodesk.AutoCAD.DatabaseServices;
...
        public static Db.ObjectId setTextStyle(Db.MText ent, String StyleName) {
            Db.ObjectId result = Db.ObjectId.Null;
            if (ent == null &#124;&#124; StyleName.Trim() == String.Empty) return result;
            Db.Database db = ent.Database;
            using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
                Db.TextStyleTable txtStyleTable = (Db.TextStyleTable)tr.GetObject(
                    db.TextStyleTableId, Db.OpenMode.ForRead);
                if (txtStyleTable.Has(StyleName)) {
                    Db.TextStyleTableRecord txtStyleTableRec = (Db.TextStyleTableRecord)tr
                        .GetObject(txtStyleTable[StyleName], Db.OpenMode.ForRead);
                    ent.UpgradeOpen();
                    result = txtStyleTableRec.ObjectId;
#if newer_than_2009
                    ent.TextStyleId = result;
#else
                    ent.TextStyle =  result;
#endif
                    ent.DowngradeOpen();
                }
                tr.Commit();
            }
            return result;
        }
...
[/cc]
Как видишь, исходный код присутствует в единственном экземпляре, а различия, специфичные для версий AutoCAD локализованы в двух строках кода.

ВНИМАНИЕ! В данном случае я объявил символ посредством строки:
[cc lang=&quot;csharp&quot;]
#define newer_than_2009 // Comment this row for AutoCAD 2009 and older
[/cc]
но в данном коде я это делаю лишь для наглядности! Грамотным решением является определение символа (в нашем случае это newer_than_2009) не в коде, а в настройках проекта: поле &quot;Conditional Compilation Symbols&quot; на вкладке &quot;Build&quot;. Если потребуется, то там можно объявлять более одного символа, отделяя их друг от друга пробелами. 
Т. о. каждый твой проект, настройки которого ориентированы на конкретную версию AutoCAD, по этим символам сам определит какие именно строки кода ему следует компилировать, а какие нет.
В составе одного решения (solution) иметь несколько проектов (project), каждый из которых имеет свои специфичные для конкретной версии AutoCAD настройки (символы, версия .NET, целевой каталог построения, разрядность, подключаемые библиотеки), но при этом общие для всех проектов (project) исходники - это, очень хорошая идея. Она проста в реализации, легка в использовании и достаточно надёжна.]]></description>
		<content:encoded><![CDATA[<p>Выкладываю обещанные мною замечания по программному коду:<br />
1. На мой взгляд, нет особой необходимости в функции getAcadProfileName(), т. к. не составляет особого труда в коде напрямую проверять значение системной переменной. Хотя, пожалуй, это дело вкуса...<br />
2. Функцию getAcadVersion я бы переписал так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">String</span> getAcadVersion<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span> coreVersion<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Int32 minMajor <span style="color: #008000;">=</span> <span style="color: #FF0000;">17</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Int32 maxMajor <span style="color: #008000;">=</span> <span style="color: #FF0000;">19</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Int32 year <span style="color: #008000;">=</span> <span style="color: #FF0000;">2007</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// The start value is the year of the [minMajor].0 core version.</span><br />
&nbsp; &nbsp; Dictionary<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">String</span>, <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&gt;</span> dict <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">String</span>, <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>Int32 major <span style="color: #008000;">=</span> minMajor<span style="color: #008000;">;</span> major <span style="color: #008000;">&lt;=</span> maxMajor<span style="color: #008000;">;</span> <span style="color: #008000;">++</span>major<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>Int32 minor <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> minor <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">3</span><span style="color: #008000;">;</span> <span style="color: #008000;">++</span>minor<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dict<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}.{1}&quot;</span>, major, minor<span style="color: #008000;">&#41;</span>, year<span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">++</span>year<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">String</span> result <span style="color: #008000;">=</span> dict<span style="color: #008000;">.</span><span style="color: #0000FF;">ContainsKey</span><span style="color: #008000;">&#40;</span>coreVersion<span style="color: #008000;">&#41;</span> <span style="color: #008000;">?</span> dict<span style="color: #008000;">&#91;</span>coreVersion<span style="color: #008000;">&#93;</span> <span style="color: #008000;">:</span> <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>В коде я исхожу из предположения, что Autodesk не станет нарушать своё правило, согласно которому назначает нумерацию версий на протяжении уже многих лет. Если в будущем правило будет изменено, то в этот код потребуется внести учитывающие этот момент изменения.<br />
Твой вариант с использованием case гораздо менее гибок, т. к. ты в нём жёстко зашил конкретные значения. Мой вариант вычисляет все значения автоматически. Позднее ты можешь изменить значение maxMajor на другое число, тем самым автоматически расширив диапазон вычисляемых значений.<br />
3. Необходимости в функции getAcadVersionWithBit(), так же как и в функции getAcadProfileName() я не вижу, поскольку разрядность AutoCAD всегда та же, что и разрядность операционной системы. В виду этого разрядность можно определять так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span> platform <span style="color: #008000;">=</span> IntPtr<span style="color: #008000;">.</span><span style="color: #0000FF;">Size</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">4</span> <span style="color: #008000;">?</span> <span style="color: #666666;">&quot;x86&quot;</span> <span style="color: #008000;">:</span> <span style="color: #666666;">&quot;x64&quot;</span><span style="color: #008000;">;</span></div></td></tr></tbody></table></div>
<p>Объединять год с разрядностью, можно либо просто конкатенацией строк (что ты и делал в своём коде), либо следующим образом (предпочитаемый мною вариант):</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}{1}&quot;</span>, year, platform<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// the 'year' is String</span></div></td></tr></tbody></table></div>
<p>4. Нет никакой необходимости в наличии функций getPathAppData() и getPathTemp(). Искомую информацию можно получить например так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span> appdata <span style="color: #008000;">=</span> Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">GetFolderPath</span><span style="color: #008000;">&#40;</span>Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">SpecialFolder</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ApplicationData</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #6666cc; font-weight: bold;">String</span> temp <span style="color: #008000;">=</span> Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">ExpandEnvironmentVariables</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;%temp%&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></td></tr></tbody></table></div>
<p>Посмотри перечисление Environment.SpecialFolder - много интересных вариантов найдёшь, а с помощью Environment.ExpandEnvironmentVariables всегда можно развернуть строку, содержащую в своём составе имя системной переменной.<br />
Примечание: Кстати, эти способы повсеместно используются в моём коде на старом сайте, странно, что ты этого не видел, если конечно вообще смотрел мой код...<br />
5. Ты создал два CS-файла: TextObjects2009.cs и TextObjects2013.cs содержимое которых отличается всего лишь несколькими строчками. Т. о. налицо дублирование существенного объема кода и в случае, если тебе потребуется вносить изменения в код - это придётся делать два раза (или столько, сколько ты создашь почти идентичных CS-файлов), о чём я тебе уже писал ранее по Skype.</p>
<p>При этом нужно будет стараться не забыть внести ВСЕ изменения, не пропустив ничего, что порой может быть затруднительно, если изменений было много, а тебя на работе отвлекают, время от времени - есть немалый шанс что-то пропустить.</p>
<p>Именно поэтому следует использовать директивы препроцессора. Покажу это на переделанном мною примере одного твоего метода (остальные делаются по аналогии):</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #008080;">#define newer_than_2009 // Comment this row for AutoCAD 2009 and older</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">Db </span><span style="color: #008000;">=</span> Autodesk<span style="color: #008000;">.</span><span style="color: #0000FF;">AutoCAD</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DatabaseServices</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span> setTextStyle<span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">MText</span> ent, <span style="color: #6666cc; font-weight: bold;">String</span> StyleName<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span> result <span style="color: #008000;">=</span> Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Null</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>ent <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span> <span style="color: #008000;">||</span> StyleName<span style="color: #008000;">.</span><span style="color: #0000FF;">Trim</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">Database</span> db <span style="color: #008000;">=</span> ent<span style="color: #008000;">.</span><span style="color: #0000FF;">Database</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">Transaction</span> tr <span style="color: #008000;">=</span> db<span style="color: #008000;">.</span><span style="color: #0000FF;">TransactionManager</span><span style="color: #008000;">.</span><span style="color: #0000FF;">StartTransaction</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTable</span> txtStyleTable <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTable</span><span style="color: #008000;">&#41;</span>tr<span style="color: #008000;">.</span><span style="color: #0000FF;">GetObject</span><span style="color: #008000;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableId</span>, Db<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenMode</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ForRead</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>txtStyleTable<span style="color: #008000;">.</span><span style="color: #0000FF;">Has</span><span style="color: #008000;">&#40;</span>StyleName<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableRecord</span> txtStyleTableRec <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableRecord</span><span style="color: #008000;">&#41;</span>tr<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">.</span><span style="color: #0000FF;">GetObject</span><span style="color: #008000;">&#40;</span>txtStyleTable<span style="color: #008000;">&#91;</span>StyleName<span style="color: #008000;">&#93;</span>, Db<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenMode</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ForRead</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">UpgradeOpen</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #008000;">=</span> txtStyleTableRec<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span><span style="color: #008000;">;</span><br />
<span style="color: #008080;">#if newer_than_2009</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleId</span> <span style="color: #008000;">=</span> result<span style="color: #008000;">;</span><br />
<span style="color: #008080;">#else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyle</span> <span style="color: #008000;">=</span> &nbsp;result<span style="color: #008000;">;</span><br />
<span style="color: #008080;">#endif</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">DowngradeOpen</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tr<span style="color: #008000;">.</span><span style="color: #0000FF;">Commit</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">...</span></div></td></tr></tbody></table></div>
<p>Как видишь, исходный код присутствует в единственном экземпляре, а различия, специфичные для версий AutoCAD локализованы в двух строках кода.</p>
<p>ВНИМАНИЕ! В данном случае я объявил символ посредством строки:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #008080;">#define newer_than_2009 // Comment this row for AutoCAD 2009 and older</span></div></td></tr></tbody></table></div>
<p>но в данном коде я это делаю лишь для наглядности! Грамотным решением является определение символа (в нашем случае это newer_than_2009) не в коде, а в настройках проекта: поле "Conditional Compilation Symbols" на вкладке "Build". Если потребуется, то там можно объявлять более одного символа, отделяя их друг от друга пробелами.<br />
Т. о. каждый твой проект, настройки которого ориентированы на конкретную версию AutoCAD, по этим символам сам определит какие именно строки кода ему следует компилировать, а какие нет.<br />
В составе одного решения (solution) иметь несколько проектов (project), каждый из которых имеет свои специфичные для конкретной версии AutoCAD настройки (символы, версия .NET, целевой каталог построения, разрядность, подключаемые библиотеки), но при этом общие для всех проектов (project) исходники - это, очень хорошая идея. Она проста в реализации, легка в использовании и достаточно надёжна.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Кулик Алексей aka kpblc</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51201</link>
		<dc:creator><![CDATA[Кулик Алексей aka kpblc]]></dc:creator>
		<pubDate>Fri, 29 Nov 2013 18:50:49 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51201</guid>
		<description><![CDATA[Удалил. Решение с директивами, как мне кажется, поднимает другой вопрос - понадобится а) менять версию .NET и б) менять выходной каталог. Лично я практически гарантирую, что рано или поздно что-нибудь да будет забыто. Именно поэтому я сделал так, как сделал :)
Насчет всего остального - спасибо, возьму на вооружение :)]]></description>
		<content:encoded><![CDATA[<p>Удалил. Решение с директивами, как мне кажется, поднимает другой вопрос - понадобится а) менять версию .NET и б) менять выходной каталог. Лично я практически гарантирую, что рано или поздно что-нибудь да будет забыто. Именно поэтому я сделал так, как сделал <img src="https://autolisp.ru/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /><br />
Насчет всего остального - спасибо, возьму на вооружение <img src="https://autolisp.ru/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Андрей</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51200</link>
		<dc:creator><![CDATA[Андрей]]></dc:creator>
		<pubDate>Fri, 29 Nov 2013 16:47:40 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51200</guid>
		<description><![CDATA[Удали моё предыдушее сообщение - там сбилось форматирование кода. Исправил это и дублирую заново:

1. На мой взгляд, в функции getAcadProfileName(), т.к. не составляет особого труда в коде напрямую проверять значение системной переменной (хотя, пожалуй, это дело вкуса).

2. Функцию getAcadVersion я бы переписал так:
[cc lang=&quot;csharp&quot;]
public static String getAcadVersion(String coreVersion) {
    Int32 minMajor = 17;
    Int32 maxMajor = 19;
    Int32 year = 2007; // The start value is the year of the [minMajor].0 core version.
    Dictionary&lt;String, String&gt; dict = new Dictionary&lt;String, String&gt;();
    for (Int32 major = minMajor; major &lt;= maxMajor; ++major) {
        for (Int32 minor = 0; minor &lt; 3; ++minor) {
            dict.Add(String.Format(&quot;{0}.{1}&quot;, major, minor), year.ToString());
            ++year;
        }
    }
    String result = dict.ContainsKey(coreVersion) ? dict[coreVersion] : String.Empty;
    return result;
}
[/cc]

3. Необходимости в функции getAcadVersionWithBit(), так же как и в функции getAcadProfileName() не вижу. Разрядность AutoCAD всегда та же, что и разрядность операционной системы. Поэтому разрядность можно определять так:
[cc lang=&quot;csharp&quot;]
String platform = IntPtr.Size == 4 ? &quot;x86&quot; : &quot;x64&quot;;
[/cc]
Объединять год с разрядностью, можно либо просто конкатенацией строк(что ты и делал), либо так (предпочитаемый мною вариант):
[cc lang=&quot;csharp&quot;]
String.Format(&quot;{0}{1}&quot;, year, platform); // year is String
[/cc]

4. Нет никакой необходимости в наличии функций getPathAppData() и getPathTemp(). Искомую информацию можно получить например так:
[cc lang=&quot;csharp&quot;]
String appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
String temp = Environment.ExpandEnvironmentVariables(&quot;%temp%&quot;);[/cc]
Кстати, эти способы повсеместно используются в моём коде на старом сайте, странно, что ты этого не видел (если читал исходники).

5. Ты создал два CS-файла: TextObjects2009.cs и TextObjects2013.cs содержимое которых отличается всего лишь несколькими строчками. Т. о. в случае, если тебе потребуется вносить изменения в код - это придётся делать два раза, о чём я уже писал выше. При этом нужно будет стараться не забыть внести все изменения, не пропустив ничего, что порой может быть затруднительно, если изменений было много (есть шанс что-то упустить). Именно поэтому следует использовать директивы препроцессора. Покажу это на примере одного твоего метода (остальные делаются по аналогии):
[cc lang=&quot;csharp&quot;]
#define newer_than_2009 // Comment this row for AutoCAD 2009 and older
using Db = Autodesk.AutoCAD.DatabaseServices;
...
        public static Db.ObjectId setTextStyle(Db.MText ent, String StyleName) {
            Db.ObjectId result = Db.ObjectId.Null;
            if (ent == null &#124;&#124; StyleName.Trim() == String.Empty) return result;
            Db.Database db = ent.Database;
            using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
                Db.TextStyleTable txtStyleTable = (Db.TextStyleTable)tr.GetObject(
                    db.TextStyleTableId, Db.OpenMode.ForRead);
                if (txtStyleTable.Has(StyleName)) {
                    Db.TextStyleTableRecord txtStyleTableRec = (Db.TextStyleTableRecord)tr
                        .GetObject(txtStyleTable[StyleName], Db.OpenMode.ForRead);
                    ent.UpgradeOpen();
                    result = txtStyleTableRec.ObjectId;
#if newer_than_2009
                    ent.TextStyleId = result;
#else
                    ent.TextStyle =  result;
#endif
                    ent.DowngradeOpen();
                }
                tr.Commit();
            }
            return result;
        }
...
[/cc]
Как видишь, исходный код присутствует в единственном экземпляре, а различия, специфичные для версий AutoCAD локализованы в двух строках кода.]]></description>
		<content:encoded><![CDATA[<p>Удали моё предыдушее сообщение - там сбилось форматирование кода. Исправил это и дублирую заново:</p>
<p>1. На мой взгляд, в функции getAcadProfileName(), т.к. не составляет особого труда в коде напрямую проверять значение системной переменной (хотя, пожалуй, это дело вкуса).</p>
<p>2. Функцию getAcadVersion я бы переписал так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">String</span> getAcadVersion<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span> coreVersion<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; Int32 minMajor <span style="color: #008000;">=</span> <span style="color: #FF0000;">17</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Int32 maxMajor <span style="color: #008000;">=</span> <span style="color: #FF0000;">19</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; Int32 year <span style="color: #008000;">=</span> <span style="color: #FF0000;">2007</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// The start value is the year of the [minMajor].0 core version.</span><br />
&nbsp; &nbsp; Dictionary<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">String</span>, <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&gt;</span> dict <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">String</span>, <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>Int32 major <span style="color: #008000;">=</span> minMajor<span style="color: #008000;">;</span> major <span style="color: #008000;">&lt;=</span> maxMajor<span style="color: #008000;">;</span> <span style="color: #008000;">++</span>major<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span>Int32 minor <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> minor <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">3</span><span style="color: #008000;">;</span> <span style="color: #008000;">++</span>minor<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dict<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Add</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}.{1}&quot;</span>, major, minor<span style="color: #008000;">&#41;</span>, year<span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">++</span>year<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">String</span> result <span style="color: #008000;">=</span> dict<span style="color: #008000;">.</span><span style="color: #0000FF;">ContainsKey</span><span style="color: #008000;">&#40;</span>coreVersion<span style="color: #008000;">&#41;</span> <span style="color: #008000;">?</span> dict<span style="color: #008000;">&#91;</span>coreVersion<span style="color: #008000;">&#93;</span> <span style="color: #008000;">:</span> <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>3. Необходимости в функции getAcadVersionWithBit(), так же как и в функции getAcadProfileName() не вижу. Разрядность AutoCAD всегда та же, что и разрядность операционной системы. Поэтому разрядность можно определять так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span> platform <span style="color: #008000;">=</span> IntPtr<span style="color: #008000;">.</span><span style="color: #0000FF;">Size</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">4</span> <span style="color: #008000;">?</span> <span style="color: #666666;">&quot;x86&quot;</span> <span style="color: #008000;">:</span> <span style="color: #666666;">&quot;x64&quot;</span><span style="color: #008000;">;</span></div></td></tr></tbody></table></div>
<p>Объединять год с разрядностью, можно либо просто конкатенацией строк(что ты и делал), либо так (предпочитаемый мною вариант):</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;{0}{1}&quot;</span>, year, platform<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// year is String</span></div></td></tr></tbody></table></div>
<p>4. Нет никакой необходимости в наличии функций getPathAppData() и getPathTemp(). Искомую информацию можно получить например так:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #6666cc; font-weight: bold;">String</span> appdata <span style="color: #008000;">=</span> Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">GetFolderPath</span><span style="color: #008000;">&#40;</span>Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">SpecialFolder</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ApplicationData</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #6666cc; font-weight: bold;">String</span> temp <span style="color: #008000;">=</span> Environment<span style="color: #008000;">.</span><span style="color: #0000FF;">ExpandEnvironmentVariables</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;%temp%&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></td></tr></tbody></table></div>
<p>Кстати, эти способы повсеместно используются в моём коде на старом сайте, странно, что ты этого не видел (если читал исходники).</p>
<p>5. Ты создал два CS-файла: TextObjects2009.cs и TextObjects2013.cs содержимое которых отличается всего лишь несколькими строчками. Т. о. в случае, если тебе потребуется вносить изменения в код - это придётся делать два раза, о чём я уже писал выше. При этом нужно будет стараться не забыть внести все изменения, не пропустив ничего, что порой может быть затруднительно, если изменений было много (есть шанс что-то упустить). Именно поэтому следует использовать директивы препроцессора. Покажу это на примере одного твоего метода (остальные делаются по аналогии):</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap;"><span style="color: #008080;">#define newer_than_2009 // Comment this row for AutoCAD 2009 and older</span><br />
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">Db </span><span style="color: #008000;">=</span> Autodesk<span style="color: #008000;">.</span><span style="color: #0000FF;">AutoCAD</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DatabaseServices</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span> setTextStyle<span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">MText</span> ent, <span style="color: #6666cc; font-weight: bold;">String</span> StyleName<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span> result <span style="color: #008000;">=</span> Db<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Null</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>ent <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span> <span style="color: #008000;">||</span> StyleName<span style="color: #008000;">.</span><span style="color: #0000FF;">Trim</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #6666cc; font-weight: bold;">String</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">Database</span> db <span style="color: #008000;">=</span> ent<span style="color: #008000;">.</span><span style="color: #0000FF;">Database</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">Transaction</span> tr <span style="color: #008000;">=</span> db<span style="color: #008000;">.</span><span style="color: #0000FF;">TransactionManager</span><span style="color: #008000;">.</span><span style="color: #0000FF;">StartTransaction</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTable</span> txtStyleTable <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTable</span><span style="color: #008000;">&#41;</span>tr<span style="color: #008000;">.</span><span style="color: #0000FF;">GetObject</span><span style="color: #008000;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableId</span>, Db<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenMode</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ForRead</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>txtStyleTable<span style="color: #008000;">.</span><span style="color: #0000FF;">Has</span><span style="color: #008000;">&#40;</span>StyleName<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableRecord</span> txtStyleTableRec <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Db<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleTableRecord</span><span style="color: #008000;">&#41;</span>tr<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">.</span><span style="color: #0000FF;">GetObject</span><span style="color: #008000;">&#40;</span>txtStyleTable<span style="color: #008000;">&#91;</span>StyleName<span style="color: #008000;">&#93;</span>, Db<span style="color: #008000;">.</span><span style="color: #0000FF;">OpenMode</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ForRead</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">UpgradeOpen</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #008000;">=</span> txtStyleTableRec<span style="color: #008000;">.</span><span style="color: #0000FF;">ObjectId</span><span style="color: #008000;">;</span><br />
<span style="color: #008080;">#if newer_than_2009</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyleId</span> <span style="color: #008000;">=</span> result<span style="color: #008000;">;</span><br />
<span style="color: #008080;">#else</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">TextStyle</span> <span style="color: #008000;">=</span> &nbsp;result<span style="color: #008000;">;</span><br />
<span style="color: #008080;">#endif</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ent<span style="color: #008000;">.</span><span style="color: #0000FF;">DowngradeOpen</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tr<span style="color: #008000;">.</span><span style="color: #0000FF;">Commit</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">...</span></div></td></tr></tbody></table></div>
<p>Как видишь, исходный код присутствует в единственном экземпляре, а различия, специфичные для версий AutoCAD локализованы в двух строках кода.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Кулик Алексей aka kpblc</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51197</link>
		<dc:creator><![CDATA[Кулик Алексей aka kpblc]]></dc:creator>
		<pubDate>Fri, 29 Nov 2013 13:10:41 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51197</guid>
		<description><![CDATA[Пиши, я ж не спец по .NET. Считай это чуть ли не первым моим экспериментом :)
P.S. Я повторяю - у меня &lt;strong&gt;не получилось&lt;/strong&gt; влегкую поменять ссылки на *mgd.dll, а также версию .NET. В результате что есть, то есть.]]></description>
		<content:encoded><![CDATA[<p>Пиши, я ж не спец по .NET. Считай это чуть ли не первым моим экспериментом <img src="https://autolisp.ru/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /><br />
P.S. Я повторяю - у меня <strong>не получилось</strong> влегкую поменять ссылки на *mgd.dll, а также версию .NET. В результате что есть, то есть.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Андрей</title>
		<link>https://autolisp.ru/2013/11/29/dotnet-difference-autocad2/comment-page-1/#comment-51196</link>
		<dc:creator><![CDATA[Андрей]]></dc:creator>
		<pubDate>Fri, 29 Nov 2013 12:55:15 +0000</pubDate>
		<guid isPermaLink="false">http://autolisp.ru/?p=1587#comment-51196</guid>
		<description><![CDATA[&gt;Переименовываем проект (не решение!) 
А почему бы сразу не задать решению одно имя, а проекту другое?

Не всегда понятно, какой код у тебя к какому файлу относится... Например первый код, как я понимаю, относится к файлу kpblcCommon.cs. Неплохо было бы первой строкой кода, в исходном файле, обозначать имя этого файла, как это зачастую делают C++ программисты. Тогда читая код однозначно понимаешь, что это за файл.

По поводу твоего кода... Он, мягко говоря, не самый хороший: замечаний много, не знаю писать тебе их сюда или не стоит, просто в комментах код будет очень нечитабелен (форматирования ведь нету).

Теперь я понял, что представляет твой вариант (partial файлы) написания исходного кода, о котором ты писал на форуме... Должен сказать, что считаю этот вариант очень плохим и более того - даже вредным: у тебя получается куча дублирующегося кода в разных файлах. 

А вот вариант с директивами препроцессора ты зря не показал, потому что это как раз и было бы наиболее правильным вариантом.]]></description>
		<content:encoded><![CDATA[<p>&gt;Переименовываем проект (не решение!)<br />
А почему бы сразу не задать решению одно имя, а проекту другое?</p>
<p>Не всегда понятно, какой код у тебя к какому файлу относится... Например первый код, как я понимаю, относится к файлу kpblcCommon.cs. Неплохо было бы первой строкой кода, в исходном файле, обозначать имя этого файла, как это зачастую делают C++ программисты. Тогда читая код однозначно понимаешь, что это за файл.</p>
<p>По поводу твоего кода... Он, мягко говоря, не самый хороший: замечаний много, не знаю писать тебе их сюда или не стоит, просто в комментах код будет очень нечитабелен (форматирования ведь нету).</p>
<p>Теперь я понял, что представляет твой вариант (partial файлы) написания исходного кода, о котором ты писал на форуме... Должен сказать, что считаю этот вариант очень плохим и более того - даже вредным: у тебя получается куча дублирующегося кода в разных файлах. </p>
<p>А вот вариант с директивами препроцессора ты зря не показал, потому что это как раз и было бы наиболее правильным вариантом.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
