C # поставить дату в программу при компиляции - PullRequest
6 голосов
/ 26 ноября 2008

Я думал о том, как создать программу, которая будет действительна только в течение периода X (в приложении C #).

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

То, что я тоже не хочу регулярно менять вручную, перекомпилировать и развертывать. Так есть ли способ установить переменную в качестве текущей даты при ее компиляции?

У меня может быть командный файл, который скомпилирует его и развернет новый exe-файл на сервере распространения.

Спасибо

Ответы [ 7 ]

6 голосов
/ 26 ноября 2008

Директивы прекомпиляции - вот ваш ключ. Вы можете создать константу в вашем приложении и установить ее при компиляции.

Однако убедитесь, что вы запутываете свой код. Кто-то может легко разобрать его и изменить константу. Другое решение состоит в том, чтобы ваша программа «телефон домой» зарегистрировалась. Таким образом, регистрационная информация хранится на вашем сервере, а не на их компьютере. Есть также сторонние пакеты, которые обеспечивают ту же безопасность, что и вы, но они стоят дорого !

5 голосов
/ 26 ноября 2008

Проверьте файл AssemblyInfo.cs в папке Properties в вашем проекте:

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Измените это на:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Затем в другом месте сборки используйте это:

System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;

// MyVersion.Build = days after 2000-01-01
// MyVersion.Revision*2 = seconds after 0-hour  (NEVER daylight saving time)
DateTime MyTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2);
return string.Format("Version:{0}  Compiled:{1:s}", MyVersion, MyTime);
3 голосов
/ 26 ноября 2008

Я бы пошел с вариантом "Телефон домой". И сделайте этот звонок важным. ;) Я имею в виду, что некоторая важная функция в вашей программе (возможно, какой-то расчет?) Будет выполняться на сервере. Поэтому, если пользователь декомпилирует программу и удалит этот «вызов домой», он сделает программу бесполезной.

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

2 голосов
/ 19 июля 2011

Я знаю, что это 3-летний вопрос, но я просто добавляю свои 2 цента. Мы используем «DateLimit», жестко запрограммированный в структуре, предложенной Джеймсом Керраном.

Но мы также используем ту же самую «Дата» в качестве простого ключа для «шифрования» и «расшифровки» (больше кода и декодирования) всех строк, меток, сообщений. Если некоторые люди (мы называем их мошенниками) хотят изменить дату истечения срока действия, им придется пройти через всю сборку, чтобы правильно ввести все эти строки для новой даты истечения срока действия. Это не идеально, но стоимость для нас сейчас близка к нулю, а цена для читеров высока.

2 голосов
/ 26 ноября 2008

В вашем автоматическом процессе сборки (вы используете автоматизированный процесс сборки, верно?) Было простое приложение, которое генерирует однострочный класс C #

 public struct TimeLimit { public DateTime Date = new DateTime(2009,1,1); }

измените дату автоматически и скомпилируйте.

Тогда просто обратитесь к TimeLimit.Date в вашем приложении.

1 голос
/ 02 декабря 2009

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

Мы как бы используем это как первый шаг в нашем контроле лицензий для одного из наших компонентов. Если вызывающая сборка имеет тот же отпечаток пальца, что и контролируемая лицензия, мы предполагаем, что она используется в нашем программном обеспечении, и лицензирование обойдено. Если вызывающая сборка имеет другой отпечаток пальца или вообще не имеет отпечатка, выполняется обычная проверка лицензии. Когда я думаю об этом, наши пользователи, вероятно, могут разбирать, компилировать без строгих имен и обходить лицензирование. Но опять же, все наши сборки поставляются как x86, а не как CIL - это что-нибудь изменит?

Наш опыт показывает, что если вы имеете дело с корпоративными клиентами, никто не может нести хлопоты по поводу ваших вещей, тем более что существует риск быть пойманным. Немного пройдёт долгий путь, наше текущее решение по лицензированию устарело (пакет включает в себя примеры для VC5!), Но до сих пор было достаточно большим препятствием. С потребителями, с другой стороны, я могу представить, что это большая угроза.

Мое первоначальное предложение, кажется, породило больше вопросов, на которые можно ответить - возможно, не очень полезных в конце концов. :)

0 голосов
/ 26 ноября 2008

Проблема с .Net заключается в том, что было бы легко декомпилировать и изменить дату, которую вы хотите использовать, имеет константу. Возможно, вам придется подумать о чем-то еще.

Вы можете написать это в реестре, но тогда люди будут редактировать это значение.

Это не идеальное решение, но иметь учетную запись, которая будет проверяться на внешнем (веб-сервере), хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...