почему сборки .net отличаются для разных архитектур?

Единственный вопрос, который имеет кучу ответов. Удостоверьтесь в путеводителе, которого я хотел бы, когда я пытался с этим справиться, чтобы он работал в 10:30 ночью в день истечения срока ... FB делает некоторые странные вещи с приложениями для холста, и хорошо, вас предупреждают. Если вы все еще здесь, и у вас есть приложение Rails, которое появится за Facebook Canvas, вам понадобится:

Gemfile:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

config / facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

config / application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

config / initializers / omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Вам нужен контроллер для вызова из настроек холста Facebook, я использовал /canvas/ и сделал маршрут для основного SiteController для этого приложения:


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


<% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
<% end %>

Источники

  • Конфигурация, на мой взгляд, взята из примера omniauth.
  • Файл gem (который является ключом !!!) пришел из: файлов слайд-шоу, которые я узнал ...
  • Этот вопрос в стеке имел весь угол Xframe , поэтому вы получите пустое место, если вы не поместите этот заголовок в контроллер приложения.
  • И мой человек @rafmagana написал этот heroku guide , который теперь вы может принять за рельсы с этим ответом и плечами гигантов, в которые вы идете.

16
задан Valentin Golev 21 February 2010 в 05:51
поделиться

4 ответа

Если код является процедурным, то обычный псевдокод, вероятно, прост (некоторые примеры есть у Википедии).

Объектно-ориентированный псевдокод может оказаться более сложным. Рассмотрим:

  • использование диаграмм классов UML для отображения классов/наследования
  • использование диаграмм последовательностей UML для отображения последовательности кода
-121--1421878-

Я считаю, что причина, по которой существуют разные цели, связана с размером скалярных типов. Я думаю, что это также влияет на способ обработки COM-объектов.

У меня есть ситуация, когда у меня есть сторонняя библиотека .NET, которая, если используется в 64-разрядном приложении, программа терпит неудачу при вызове библиотеки, поэтому я должен ограничиться только 32-разрядным режимом.

-121--1740775-

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

Как я понимаю, эта настройка является флагом, который говорит «сборка должна выполняться в этом типе архитектуры». Это для настроек x86 и x64. Настройка MSIL/.NET просто говорит: «Мне все равно, я могу запустить либо, так что выберите оптимальный или доступный».

Например, вы можете выполнять вызовы для Win32 функций API через P/Invoke, в этом случае сборка не будет работать на x64 и вы должны отметить ее как x86.

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

Setting        x86      x64  <-- Platform (CPU/OS)
MSIL/.NET     32-bit   64-bit
x86           32-bit   32-bit
x64           N/A (*)  64-bit

N/A для сборки x64 на x86 означает, что сборка не будет загружена, и вы получите исключение, если попытаетесь.

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

Основная исполняемая сборка MSIL будет работать как 32-разрядная в 32-разрядной операционной системе (например, если он был установлен на x86, с указанной выше точкой отказа,) и как 64-разрядная в 64-разрядной операционной системе (например, если она была установлена на x64, с указанной выше точкой отказа).

Очевидно Как правило, вы хотите использовать MSIL настройки, если вы не вызываете сборки, помеченные как нечто конкретное, и если вы не делаете P/Invoke, который не переносится на 32-разрядные и 64-разрядные (Я понятия не имею, работает ли это, если P/Invoke to win-api функции будут сопоставлены с правильно битовым DLL или нет.)

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

22
ответ дан 30 November 2019 в 21:02
поделиться

Во-первых, установка Platform Target на x86 в вашем .exe проекте очень полезна, когда вы отлаживаете свой проект на 64-битная версия Windows. Отладчик VS2005 / 8 не поддерживает Edit + Continue в 64-битном коде.

Выбор x86 в вашей сборке релиза - это то, что вам следует сделать, если ваша программа зависит от компонента, который работает только в 32-битном коде. Это не редкость, существует масса компонентов COM, которые никогда не были и никогда не будут перенесены на 64-битный неуправляемый код. Классическим примером является ядро ​​базы данных Microsoft Jet.

Выбор x64 очень необычен, здесь не так много неуправляемого кода, который доступен только в 64-битной версии. Примечательно то, что вы получите предупреждения при сборке сборки. Есть несколько сборок .NET framework, которые содержат неуправляемый код; в каталоге c: \ windows \ microsoft.net доступны только их 32-разрядные версии.Вы можете спокойно игнорировать эти предупреждения, 64-битные версии фактически установлены в GAC.

Один недостаток при выборе x64 заключается в том, что компилятор C # 3.0 выдаст двоичный файл, который просит Windows создать поток запуска с размером стека 4 мегабайта вместо 1 мегабайта по умолчанию. Это несколько оправдано, 64-битный код требует больше стека для хранения указателей и адресов возврата.

Наконец, в Windows SDK есть инструмент Corflags.exe для переключения разрядности сборки после ее сборки. Параметр / 32BIT + эквивалентен установке Platform Target на x86. Использование / 32BIT - гарантирует, что сборка будет работать в 64-битном режиме в 64-битной операционной системе. Изменить размер стека по умолчанию можно с помощью инструмента Editbin.exe.

3
ответ дан 30 November 2019 в 21:02
поделиться

Этот флаг важен для EXE-файлов. Он решает, будете ли вы запускать 32-битный или 64-битный процесс. Если вы используете «родные» библиотеки DLL из вашего кода .NET, вам необходимо следовать архитектуре этих DLL.

Параметр «Любой процессор» в EXE-файлах будет выбирать x64, если он доступен.

3
ответ дан 30 November 2019 в 21:02
поделиться

Я считаю, что причина, по которой существуют разные цели, связана с размером скалярных типов. Я думаю, это также влияет на то, как обрабатываются COM-объекты.

У меня есть ситуация, когда у меня есть сторонняя библиотека .NET, которая при использовании в 64-битном приложении дает сбой при вызове библиотеки, поэтому я должен ограничиться только 32-битным режимом.

1
ответ дан 30 November 2019 в 21:02
поделиться
Другие вопросы по тегам:

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