Тип pointer-to-member-function
отличается от pointer-to-function
.
Тип функции различается в зависимости от того, является ли она обычной или нестатической функцией-членом некоторого класса:
int f(int x);
the type is "int (*)(int)" // since it is an ordinary function
И
int Mat::f2(int x);
the type is "int (Mat::*)(int)" // since it is a non-static member function of class Mat
Примечание: если это статическая функция-член класса Fred, ее тип такой же, как если бы она была обычной функцией: "int (*)(char,float)"
В C ++ функции-члены имеют неявный параметр который указывает на объект (указатель this внутри функции-члена). Нормальные функции C могут рассматриваться как имеющие другое соглашение о вызовах от функций-членов , поэтому типы их указателей (указатель на функцию-член и указатель на функцию) различны и несовместимы. C ++ вводит новый тип указателя, , называемый указатель на член, который может быть вызван только путем предоставления объекта .
ПРИМЕЧАНИЕ: не пытайтесь «привести» функцию указатель к члену в указатель на функцию; результат не определен и, вероятно, катастрофический. Например, указатель на функцию-член не обязан содержать машинный адрес соответствующей функции. Как было сказано в последнем примере, если у вас есть указатель на обычную функцию C, используйте либо функцию верхнего уровня (не член), либо статическую (класс) функцию-член.
Я думаю, что вы хотите заменить во время выполнения версию вашего конфигурационного файла, если это так, создайте копию вашего конфигурационного файла (также дайте ей соответствующее расширение, например .Debug или .Release ) с правильными адресами (что дает вам отладочную версию и версию во время выполнения) и создает этап пост-сборки, который копирует правильный файл в зависимости от типа сборки.
Вот пример события пост-сборки, которое я использовал в прошлом, который заменяет выходной файл правильной версией (отладка / время выполнения)
copy "$(ProjectDir)ServiceReferences.ClientConfig.$(ConfigurationName)" "$(ProjectDir)ServiceReferences.ClientConfig" /Y
, где: $ (ProjectDir) - это каталог проекта, в котором расположены файлы конфигурации $ (ConfigurationName) - активный тип сборки конфигурации
РЕДАКТИРОВАТЬ: См. Ответ Марка для подробного объяснения того, как это сделать программно.
Это на стороне клиента ??
Если да, вам нужно создать экземпляр WsHttpBinding и EndpointAddress, а затем передать эти два конструктору прокси-клиента, который принимает эти два параметра в качестве параметров.
// using System.ServiceModel;
WSHttpBinding binding = new WSHttpBinding();
EndpointAddress endpoint = new EndpointAddress(new Uri("http://localhost:9000/MyService"));
MyServiceClient client = new MyServiceClient(binding, endpoint);
Если он находится на стороне сервера, вам необходимо программно создать свой собственный экземпляр ServiceHost и добавить к нему соответствующие конечные точки службы.
ServiceHost svcHost = new ServiceHost(typeof(MyService), null);
svcHost.AddServiceEndpoint(typeof(IMyService),
new WSHttpBinding(),
"http://localhost:9000/MyService");
Конечно, у вас может быть несколько из эти конечные точки службы добавлены к вашему узлу службы. Когда вы закончите, вам нужно открыть хост службы, вызвав метод .Open ().
Если вы хотите иметь возможность динамически - во время выполнения - выбирать, какую конфигурацию использовать, вы можете определить несколько конфигураций, каждая с уникальным именем, а затем вызовите соответствующий конструктор (для вашего хоста службы или ваш прокси-клиент) с именем конфигурации, которое вы хотите использовать.
Например, вы можете легко получить:
<endpoint address="http://mydomain/MyService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IASRService"
contract="ASRService.IASRService"
name="WSHttpBinding_IASRService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="https://mydomain/MyService2.svc"
binding="wsHttpBinding" bindingConfiguration="SecureHttpBinding_IASRService"
contract="ASRService.IASRService"
name="SecureWSHttpBinding_IASRService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://mydomain/MyService3.svc"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IASRService"
contract="ASRService.IASRService"
name="NetTcpBinding_IASRService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
(три разных имени, разные параметры, указав разные параметры привязки), а затем просто выберите правильный вариант для создания экземпляра вашего сервера ( или клиентский прокси).
Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.
Marc
Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.
Marc
Но в обоих случаях - сервер и клиент - вы должны выбрать перед фактическим созданием хоста службы или прокси-клиента. После создания они неизменяемы - вы не можете изменять их, когда они будут запущены и работают.
Marc
require 'mechanize'
class Foo
def some_method
begin
do_some_stuff
rescue WWW::Mechanize::ResponseCodeError => e
if e.response_code.to_i == 503
handle_the_situation
end
end
end
end
describe "Foo" do
it "should handle a 503 response" do
page = stub(:code=>503)
foo = Foo.new
foo.should_receive(:do_some_stuff).with(no_args)\
.and_raise(WWW::Mechanize::ResponseCodeError.new(page))
foo.should_receive(:handle_the_situation).with(no_args)
foo.some_method
end
end
-121--3498681- Я оставляю цитату из презентации, которую Дуглас Крокфорд (создатель стандарта JSON) дал Yahoo.
Он рассказывает о том, как он открыл JSON, и, среди прочего, почему он решил использовать процитированные ключи :
... Это было, когда мы обнаружили проблема с именем без кавычек. Получается Сценарий ECMA 3 зарезервирован политика слов. Зарезервированные слова должны быть в ключевой позиции, которая действительно неприятность. Когда я обошел чтобы сформулировать это в стандарт, я не хотел, чтобы пришлось положить все зарезервированные слова в стандарте, потому что это выглядело бы очень глупо.
В то время я пытался убедить люди: да, можно писать приложения в JavaScript, это на самом деле собирается работать и это хорошо язык. Тогда я не хотел говорить: одновременно: и посмотрите на это очень глупо, что они сделали! Так что я решил, вместо этого давайте просто процитируем ключи.
Таким образом, мы не должны говорить кто-нибудь о том, как это.Вот почему по сей день ключи приводятся в JSON.
Полный текст видео и стенограммы можно найти здесь .
-121--785955-Для изменения адреса конечной точки в файле App.Config. Перед использованием можно изменить или удалить пространство имен.
using System;
using System.Xml;
using System.Configuration;
using System.Reflection;
//...
namespace Glenlough.Generations.SupervisorII
{
public class ConfigSettings
{
private static string NodePath = "//system.serviceModel//client//endpoint";
private ConfigSettings() { }
public static string GetEndpointAddress()
{
return ConfigSettings.loadConfigDocument().SelectSingleNode(NodePath).Attributes["address"].Value;
}
public static void SaveEndpointAddress(string endpointAddress)
{
// load config document for current assembly
XmlDocument doc = loadConfigDocument();
// retrieve appSettings node
XmlNode node = doc.SelectSingleNode(NodePath);
if (node == null)
throw new InvalidOperationException("Error. Could not find endpoint node in config file.");
try
{
// select the 'add' element that contains the key
//XmlElement elem = (XmlElement)node.SelectSingleNode(string.Format("//add[@key='{0}']", key));
node.Attributes["address"].Value = endpointAddress;
doc.Save(getConfigFilePath());
}
catch( Exception e )
{
throw e;
}
}
public static XmlDocument loadConfigDocument()
{
XmlDocument doc = null;
try
{
doc = new XmlDocument();
doc.Load(getConfigFilePath());
return doc;
}
catch (System.IO.FileNotFoundException e)
{
throw new Exception("No configuration file found.", e);
}
}
private static string getConfigFilePath()
{
return Assembly.GetExecutingAssembly().Location + ".config";
}
}
}