В нашем продукте есть вещи, называемые «сервисами», которые являются основными средствами связи между различными частями продукта (и особенно между языками — внутренним языком C, Python и .NET).
В настоящее время код выглядит так (Services.Execute
с использованием params object[] args
):
myString = (string)Services.Execute("service_name", arg1, arg2, ...);
Я бы предпочел иметь возможность писать такой код и пользоваться преимуществами проверки типов и менее подробным кодом:
myString = ServiceName(arg1, arg2, ...);
Это может быть достигнуто с помощью простой функции,
public static string ServiceName(int arg1, Entity arg2, ...)
{
return (string)Services.Execute("service_name", arg1, arg2, ...);
}
Но это довольно многословно, и не так просто справиться с этим для множества сервисов, как я собираюсь сделать.
Глядя на то, как работают extern
и DllImportAttribute
, я надеюсь, что можно будет подключить это каким-то образом:
[ServiceImport("service_name")]
public static extern string ServiceName(int arg1, Entity arg2, ...);
Но я вообще не знаю, как этого добиться, и не могу найти для этого никакой документации (extern
кажется довольно расплывчато определенным вопросом). Самый близкий, который я нашел, - это несколько связанный вопрос, Как предоставить пользовательскую реализацию для внешних методов в .NET? что на самом деле не ответило на мой вопрос и в любом случае несколько отличается. Спецификация языка C# (особенно в версии 4.0, раздел 10.6.7, Внешние методы) не помогает.
Итак, я хочу предоставить собственную реализацию внешних методов; можно ли этого добиться? И если да, то как?