Кросс-языковое программирование - список эквивалентных типов? - PullRequest
1 голос
/ 23 ноября 2011

Я делаю большую часть своей разработки с использованием Delphi (особенно D7).Я также делаю некоторую вторичную работу с ASP.NET / C #.Я сталкиваюсь с необходимостью преобразования кода с одного языка на другой, а также выясняю, как правильно публиковать функции DLL на одной стороне для вызова с другой стороны.

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

Оригинал Delphi Источник:

if X = 5 then begin
  S:= IntToStr(1);
end else begin
  S:= IntToStr(-1);
end;

C # Перевод:

if (X == 5)
{
  S = (1).ToString();
}
else
{
  S = (-1).ToString();
}

Функция Delphi DLL:

function DoSomething(const In: PChar; const zIn: Integer; 
  var Out: PChar; var zOut: Integer): Boolean; stdcall;

C # Импорт:

[DllImport("MyDll.dll", CharSet=CharSet.AnsiChar, 
  CallingConvention=CallingConvention.StdCall)]
public static extern bool DoSomething(in string In, in int zIn, 
  out string Out, out int zOut);

(Пожалуйста, прости меня, если этонеправильно, я набрал его по памяти, а не по копированию / вставке)

Мне бы хотелось иметь какой-то словарь эквивалентности между языками, поэтому я знаю, как сопоставить один конец другому.Кто-нибудь знает какой-нибудь хороший сайт или книгу?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

Вы можете использовать Reflector для декомпиляции большинства сборок .net на различные языки, включая c # и объект pascal.Это хороший способ сравнить одно с другим.

http://www.reflector.net/

Кстати, размер кода мне кажется примерно одинаковым

if X = 5 then begin
  S:= IntToStr(1);
end else begin
  S:= IntToStr(-1);
end;

против

if (X == 5) {
  S = (1).ToString();
} else {
  S = (-1).ToString();
}

70 символов против 61 символа.

Или даже ...

s = (x == 5) ? ""+1 : ""+(-1);

(приведенная выше строка предназначена только для развлечения.лучше использовать 1.ToString () и т. д., потому что "" +1 приводит к упаковыванию int и отправке его как единственного параметра в Concat (объект), который затем выполняет ToString () для него. Более эффективно просто вызывать ToString() прямо на инт.)

1 голос
/ 28 ноября 2011

Я только что наткнулся на эту статью сегодня, которая охватывает в основном именно то, что я хотел знать.

1 голос
/ 23 ноября 2011

Иметь чтение атрибута CLSCompliant.

Если вы хотите обеспечить взаимодействие, вам просто нужно убедиться, что публичные API вашего класса соответствуют CLS-соответствию. Я не уверен, что вы можете запустить FXCop для сборки delphi, но если вы объявите атрибут CLSCompliant, он будет жаловаться, когда сталкивается с нарушениями.

0 голосов
/ 23 ноября 2011

Вы можете перейти к [developerfusion] [1] [1]: http://www.developerfusion.com/tools/convert/csharp-to-python/, чтобы узнать, как переводить исходный код между языками.

...