.NET 3.5 Клиентских распространяемых файла Платформы?

Проще говоря, нет. Не гарантируемый на всей архитектуре.

Мой вопрос: почему? Если Вы хотите выделить тип, достаточно большой для хранения void*, лучшая вещь выделить (удивительно достаточно :-) void*. Почему там потребность соответствовать ему в int?

РЕДАКТИРОВАНИЕ: На основе Ваших комментариев к Вашему дублирующемуся вопросу Вы хотите сохранить специальные значения указателя (1,2,3) для указания на дополнительную информацию.

НЕТ!! Не делайте этого!! . Нет никакой гарантии, которые 1, 2 и 3 не совершенно допустимые указатели. Это может иметь место в системах, где Вы обязаны выравнивать указатели на 4-байтовых границах, но, так как Вы спросили обо всей архитектуре, я предполагаю, что у Вас есть мобильность как высокое значение.

Находят другой способ сделать это, это корректно. Например, используйте объединение (синтаксис из памяти, может быть неправильным):

typedef struct {
    int isPointer;
    union {
        int intVal;
        void *ptrVal;
    }
} myType;

Затем можно использовать isPointer 'булевскую переменную', чтобы решить, необходимо ли рассматривать объединение как целое число или указатель.

РЕДАКТИРОВАНИЕ:

, Если скорость выполнения имеет главное значение, то решением для определения типа является способ пойти. В основном необходимо будет определить целое число, которое Вы хотите для каждой платформы, на которой Вы хотите работать. Можно сделать это с условной компиляцией. Я также добавил бы в проверке на этапе выполнения, чтобы гарантировать, что Вы скомпилировали для каждой платформы правильно таким образом (я определяю ее в источнике, но Вы передали бы это как флаг компилятора, как" cc -DPTRINT_INT"):

#include <stdio.h>
#define PTRINT_SHORT
#ifdef PTRINT_SHORT
    typedef short ptrint;
#endif
#ifdef PTRINT_INT
    typedef int ptrint;
#endif
#ifdef PTRINT_LONG
    typedef long ptrint;
#endif
#ifdef PTRINT_LONGLONG
    typedef long long ptrint;
#endif

int main(void) {
    if (sizeof(ptrint) != sizeof(void*)) {
        printf ("ERROR: ptrint doesn't match void* for this platform.\n");
        printf ("   sizeof(void*    ) = %d\n", sizeof(void*));
        printf ("   sizeof(ptrint   ) = %d\n", sizeof(ptrint));
        printf ("   =================\n");
        printf ("   sizeof(void*    ) = %d\n", sizeof(void*));
        printf ("   sizeof(short    ) = %d\n", sizeof(short));
        printf ("   sizeof(int      ) = %d\n", sizeof(int));
        printf ("   sizeof(long     ) = %d\n", sizeof(long));
        printf ("   sizeof(long long) = %d\n", sizeof(long long));
        return 1;
    }

    /* rest of your code here */

    return 0;
}

В моей системе (Ubuntu 8.04, 32-разрядная), я добираюсь:

ERROR: ptrint typedef doesn't match void* for this platform.
   sizeof(void*    ) = 4
   sizeof(ptrint   ) = 2
   =================
   sizeof(short    ) = 2
   sizeof(int      ) = 4
   sizeof(long     ) = 4
   sizeof(long long) = 8

В этом случае, я знал бы, что должен был скомпилировать с PTRINT_INT (или долго). Может быть способ поймать это во время компиляции с #if, но я не мог быть побеспокоен, исследовав его в данный момент. При нанесении удара платформы, где нет никакого целого типа, достаточного для содержания указателя, Вам не повезло.

Имеют в виду, что использование специальных значений указателя (1,2,3) для представления целых чисел не может также работать над всеми платформами - это может на самом деле быть действительными адресами памяти для указателей.

однако, если Вы собираетесь проигнорировать мой совет, нет очень, я могу сделать для остановки Вас. Это - Ваш код, в конце концов, :-). Одна возможность состоит в том, чтобы проверить все Ваши возвращаемые значения от malloc и, если Вы добираетесь 1, 2 или 3, просто malloc снова (т.е. имейте mymalloc (), который делает это автоматически). Это будет незначительной утечкой памяти, но она не гарантирует столкновений между Вашими специальными указателями и реальными указателями.

6
задан abatishchev 14 June 2010 в 13:50
поделиться

2 ответа

Не существует официальной распространяемой версии для v3.5. Я сам искал один, но отказался.

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

] Конечно, если Google не сможет дать вам ответ на этот пакет, маловероятно, что вы его найдете.

2
ответ дан 17 December 2019 в 07:07
поделиться

Если вы загрузите полный пакет клиента и откроете его с помощью вашего любимого программного обеспечения для сжатия (WinZIP, WinRAR, 7-zip, IZArc, ...), вы должны иметь возможность извлечь несколько установочных файлов с именами:

  • DotNetFx20Client_Package_x86.exe (14 MiB)
  • DotNetFx30Client_Package_x86.exe (8 MiB)
  • DotNetFx35Client_Package_x86.exe (<1MiB)

Похоже, что они являются накопительным установщиком 3 версии клиентского каркаса.

Но я понятия не имею, можно ли распространять эти пакеты напрямую, без полного пакета.

2
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: