Нет выбора. .NET Standard предназначен только для библиотек классов .NET. Это не среда выполнения, поэтому нельзя создавать приложения, нацеленные на нее. Средами выполнения являются .NET Core и .NET Full framework.
.NET Core - единственный кроссплатформенный вариант.
ASP.NET Core сам по себе является веб-стеком, который может работать в обеих средах выполнения. Вы можете выбрать тот, который вы хотите в диалоговом окне New Project
.
Когда дело доходит до библиотек, выбор зависит от того, что нужно. Стандартные библиотеки .NET могут предназначаться для любой совместимой среды выполнения. Собственные библиотеки классов Razor в ASP.NET Core являются проектами .NET Standard 2.0. Большинство пакетов NuGet совместимы со стандартом .NET, чтобы избежать хлопот упаковки разных версий для каждой среды выполнения.
С другой стороны, последние функции, связанные с Span, появляются только в .NET Core 2.1 и более поздних версиях. Они недоступны в .NET Standard 2.0 , но они появятся в 2.1. Этот пример из All About Span: Изучение нового .NET Mainstay будет работать только в .NET Core 2.1+:
string input = ...;
ReadOnlySpan inputSpan = input;
int commaPos = input.IndexOf(',');
int first = int.Parse(inputSpan.Slice(0, commaPos));
int second = int.Parse(inputSpan.Slice(commaPos + 1));
Проще говоря, нет никакого портативного пути. Необходимо будет протестировать на систему и использовать предпочтительный метод для той системы.
Далее, я смущен тем, что Вы подразумеваете под именами процесса в Windows.
Вы имеете в виду сервисное название? Я предполагаю так, потому что ничто иное действительно не имеет смысла (по крайней мере, к моему мозгу использования не-Windows).
Если так, необходимо использовать интерфейс WMI Tim Golden и назвать.Change метод на сервисе..., по крайней мере, согласно его учебное руководство .
Для Linux ни один из методов, которые я нашел работавшим за исключением этот плохо упакованный модуль , который устанавливает argv [0] для Вас.
я даже не знаю, будет ли это работать над вариантами BSD (который действительно имеет setproctitle системный вызов). Я - вполне уверенный argv [0], не будет работать над Солярисом.
Во-первых, я не уверен, что просто настройки argv[0]
в программе C портативно меняют имя, показанное в ps
. Возможно, это делает в некотором unixen, но мое понимание - то, что это, как не ожидают.
, Что еще более важно, мое понимание изменения argv[0]
- то, что оно требует, чтобы вызов к exec
внес эти изменения. А именно, эти exec
вызов имеет и путь к исполняемому файлу и отдельное argv
список. Совершение Вашего собственного звонка позволяет Вам повреждать конвенцию оболочки того, чтобы ставить исполняемое имя в argv[0]
.
Вы имеете управление процессами библиотеки OS , который предоставляет Вам прямой доступ к библиотеке OS для того, чтобы сделать это. Необходимо рассмотреть повреждение сценария в две части - начинающий и "реальная работа". Начинающий устанавливает среду выполнения и должностное лицо реальная работа с желаемыми параметрами.
В C, Вы заменяете свой собственный процесс другим. В Python Вы заменяете старый интерпретатор Python новым, который имеет другой argv [0]. Хотелось бы надеяться, это не передумает относительно этого. Некоторые программы проверяют argv [0] для решения то, что они делают.
Вы также имеете subprocess.popen, который можно использовать для установки желаемого args и исполняемого файла. В этом случае, однако, родительский процесс должен задерживаться для сбора дочернего элемента, когда ребенок заканчивает. Родитель не может делать чего-то большего чем Popen.wait
In [1]: import sys
In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py
In [3]: sys.argv[0] = 'foo'
In [4]: print sys.argv[0]
foo
Примечание сингл '=' знак
на самом деле вам нужно 2 вещи в linux: изменить argv [0]
из C
(для ps auxf
и друзей) и вызовите prctl
с флагом PR_SET_NAME
.
Нет абсолютно никакого способа сделать первую часть из самого python. Хотя вы можете просто изменить имя процесса, вызвав prctl.
def set_proc_name(newname):
from ctypes import cdll, byref, create_string_buffer
libc = cdll.LoadLibrary('libc.so.6')
buff = create_string_buffer(len(newname)+1)
buff.value = newname
libc.prctl(15, byref(buff), 0, 0, 0)
def get_proc_name():
from ctypes import cdll, byref, create_string_buffer
libc = cdll.LoadLibrary('libc.so.6')
buff = create_string_buffer(128)
# 16 == PR_GET_NAME from <linux/prctl.h>
libc.prctl(16, byref(buff), 0, 0, 0)
return buff.value
import sys
# sys.argv[0] == 'python'
# outputs 'python'
get_proc_name()
set_proc_name('testing yeah')
# outputs 'testing yeah'
get_proc_name()
ps auxf
после этого покажет просто «python» :(. Но top
и ps -A
будут показать новое имя процесса 'testing yeah' :). Также killall
и pkill
будут работать с новым именем.
Кстати, procname из googlecode также изменяет argv [0]
, таким образом, даже изменяется ] ps auxf
output.
ОБНОВЛЕНИЕ : Решение, опубликованное в этом ответе, иногда не работает на FreeBSD. Сейчас я использую py-setproctitle , заявленный в этом ответе в течение года или около того на различных ящиках linux и freebsd. Пока нет сбоев! Всем тоже! :). Он использует почти тот же код, что и PostgreSQL использует в своей основной базе данных и дочерних процессах.
Недавно я написал модуль Python для изменения названия процесса переносимым способом: проверьте https://github.com/dvarrazzo/py-setproctitle
Это оболочка вокруг кода, используемого PostgreSQL для изменения заголовка. В настоящее время он протестирован на Linux и Mac OS X: Windows (с ограниченной функциональностью) и перенос BSD находятся в процессе.
Изменить: по состоянию на июль 2010 года модуль работает с BSD и с ограниченной функциональностью в Windows, и был перенесен на Python 3.x.
Посмотрите на setproctitle package
Это довольно портативная версия и работает на многих платформах.
pip install setproctitle
import setproctitle
setproctitle.setproctitle('new proc title as seen in top')