C # - C совместимость - PullRequest
       4

C # - C совместимость

3 голосов
/ 18 января 2011

Q / A на текст ссылки очень близко подходит к тому, что я ищу, но я только начинаю на C # и мне нужно немного больше заполнить и, возможно, некоторые подсказки о лучшем способе продолжить.

У меня есть приложение, которое я написал для PalmPre / webOS на Javascript, и часть его написана на C для мобильности, а не для производительности. Это делает расчеты производительности Lear Jet.

В мире webOS код C (плагин) идет своим собственным процессом, и у JS есть способ вызывать и вызывать код C (используя 'main'), чтобы запустить процесс, и C может регистрировать точки входа. Затем JS может вызвать точку входа с некоторыми аргументами, код C выполняет вычисления, а затем C возвращает указатель на строку цифр в JS для отображения. В коде C нет графики, нет динамического распределения памяти и т. Д. Я хотел бы по существу преобразовать код графического интерфейса JS в C # и использовать код C с небольшими изменениями (# if) для C #, чтобы делать то же самое, что и JS Pre делает сейчас.

Ответ 1 / option2 Я думаю, что лучше, но я не понял, что он имел в виду под «ваш проект против потребительского проекта» и как / почему это означает, что один - dllimport, а другой - dllexport, а я нет у меня есть DLL, у меня есть только подпрограммы кода C. Похоже, все, что мне нужно сделать, это заменить его 'PublicFunc' моей подпрограммой C, верно? И у меня может быть несколько аргументов, где написано «params»? Однако тип возврата не указан, как бы я вернул ответ на C #? Является ли «возвращение» зарезервированным словом? Или пример заполнителя? Или я не в курсе, потому что у меня нет DLL? Кстати, в коде C есть режим компиляции для запуска автономной программы DOS для тестирования.

Есть ли где-нибудь простой пример кода, который иллюстрирует, как это сделать? Я загружаю MS VS 2010 Express сейчас, еще не установил его. Возможно, там что-то есть?

ТИА!

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

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

// Вот код C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;     // DLL support
namespace ConsoleApplication1
{
  class Program
  {
    [DllImport("dodll.dll",
           CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.LPStr)]
    private static extern string dodll(int a, int b,
                       [MarshalAs(UnmanagedType.LPArray)] float[] nums,
                       [MarshalAs(UnmanagedType.LPStr)] string strA,
                       [MarshalAs(UnmanagedType.LPStr)] string strB);

static void Main(string[] args)
{
  int x = 2; int y = 3;
  float[] numbers = new float[3]{12.3F, 45.6F, 78.9F};
  float[] simargs = new float[20];

  string strvarA = "Test string A";
  string strvarB = "Test another string";
  string answer = dodll(x, y, numbers, strvarA, strvarB);
  Console.WriteLine("hello world " + answer);
  Console.WriteLine("another hello world" + x);
  Console.WriteLine("End of sim");
}

} }


// Вот код C (DLL):

#include <stdio.h>
char astring[50];
//Passing structure pointer info: http://www.adp-gmbh.ch/win/misc/mingw/dll.html
extern "C"
{  __declspec(dllexport) 
char* dodll( long a, long b, float* aptr, char* sa, char* sb)
{
    float nums[3];
    nums[0] = *aptr;
    nums[1] = *(aptr+1);
    nums[2] = *(aptr+2);
  sprintf(astring, "Building string: %s %s %ld, nrs are %2.1f, %2.1f, %2.1f.\n",
  sa, sb, (a+b), nums[0], nums[1], nums[2]);
  printf("Inside DLL: %s\n", astring);
  return astring;
}
}
0 голосов
/ 23 июля 2011

Приложение ... Я недавно обнаружил, что Windows Phone 7 C # / XAML НЕ поддерживает связывание с C / C ++, так что это выходит из-под контроля.Очевидно, все должно быть в C #, и я не собираюсь переписывать весь свой код графического анализа и базу данных в C #, поэтому я перейду к Android.

0 голосов
/ 10 марта 2011

Я бы начал здесь: MSDN на Interop

... обязательно выберите нужную версию VS (2005/2008/2010) ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...