Используя аргументы ключевого слова как присвоения
Иногда каждый хочет создать диапазон из функций в зависимости от одного или нескольких параметров. Однако это могло бы легко привести к закрытиям все обращение к тому же объекту и значению:
funcs = []
for k in range(10):
funcs.append( lambda: k)
>>> funcs[0]()
9
>>> funcs[7]()
9
Этого поведения можно избежать путем превращения лямбда-выражения в функцию, зависящую только от ее аргументов. Ключевой параметр хранит текущее значение, которое связывается с ним. Вызов функции не должен быть изменен:
funcs = []
for k in range(10):
funcs.append( lambda k = k: k)
>>> funcs[0]()
0
>>> funcs[7]()
7
Он пока недоступен, но команда проекта Mono работает над компилятором Ahead of Time , который сделает то, что вы ищете. Предполагается, что Mono будет работать на iPhone (например, Unity), но он должен работать на всех платформах.
Редактировать: Он поддерживает Mono x86, но я не уверен, что они включили функцию, которая объединяет еще в зависимых классах (хотя из интервью, которое я слышал, это планируется)
Редактировать 2: В настоящее время поддерживается включение зависимостей, спасибо Dykam!
No, NGen'd code still needs the framework - it only pre-JITs the code in your own assemblies. It also requires the framework for the CLR itself.
I believe Mono has a static compiler which they're planning on using for the iPhone. I don't know whether that will work on Windows as well though.
There used to be a product called Thinstall which some people used for this. It's now called ThinApp - basically it's application virtualisation. It's commercial, but you may well be able to get hold of a trial version.
Personally I'd be somewhat concerned about any such product - when it comes to deployment, veering away from the mainstream way of doing things sounds like a recipe for lots of support calls. There's just an awful lot to go wrong. I'm not saying it doesn't work, just that I'd be wary.
Have you looked at the .NET 3.5 (SP1) Client Profile? That may help to reduce your installation requirements a little.
Вы можете использовать NGen, чтобы сделать ваше приложение собственным исполняемым файлом, но оно все равно будет зависеть от инфраструктуры .Net.
С помощью .net 3.5 SP1 можно установить меньшее подмножество .net framework. Взгляните на этот снимок экрана:
(источник: windowsclient.net )
NGen компилирует exes в родные exes, поэтому их не нужно компилировать JIT при запуске. Тем не менее, они все еще зависят от фреймворка.
Есть несколько коммерческих компаний, которые действительно предоставляют продукты для компиляции сборок .net в автономные exes. Xenocode и виртуальное ПО Thinapp . Но оба они не из дешевых.
Вам нужно будет установить только ту версию .NET, на которую вы нацеливаетесь, например .NET1.1 или .NET2.0
Правка : если вам нужно настроить таргетинг на версию 3.5, вам нужно будет установить и 2.0, и 3.5
ILMerge (бесплатно) может объединить несколько сборок в одну, но я не Я думаю, что он работает с ядром среды выполнения.
Короче говоря, я думаю, что если вы хотите запускать программы .NET, вам потребуется установленная .NET Framework.
Некоторые обфускаторы делают это, но вам придется сделать это заранее (прежде, чем вы отправите это своим пользователям). Примером может служить Salamander remotesoft .
Вот коммерческий продукт, который утверждает, что это делает здесь:
http://www.xenocode.com/Obfuscator/
«Развертывайте приложения .NET безопасно, без установки .NET Framework»
Не знаю, какие у этого могут быть недостатки
ThinApp (ранее Thinstall) от vmware. Раньше он был очень дорогим.
Единственным продуктом, который мы разработали для решения этой проблемы в 2007 году, был Xenocode Postbuild . С тех пор мы успешно используем этот продукт, а также его неплохие возможности виртуализации.
Единственная проблема заключается в том, что приобретенная нами версия не поддерживает Windows 7 (где вам не нужно устанавливать .NET framework для запуска вашей программы, скомпилированной с версией <4.0). Я написал в Xenocode. Они ответили
. Чтобы получить поддержку Win 7, вам следует перейти на последнюю версию Postbuild (теперь она называется .NET Obfuscator ). Win 7 не поддерживается платформой для Postbuild 2007.