2011-01-18 7 views
3

link text의 Q/A는 내가 찾고있는 것에 매우 가깝지만 C#을 시작하고 진행하기위한 최선의 방법에 대해 약간의 힌트가 필요합니다.C# - C 상호 운용성

자바 스크립트로 PalmPre/webOS 용으로 작성한 앱이 있는데 그 중 일부는 성능을 위해가 아니라 휴대 가능하도록 C로 작성되었습니다. Lear Jet 성능 계산을 수행합니다.

webOS 세계에서 C 코드 (플러그인)는 자체 프로세스로 진행되며 JS가 프로세스를 시작하기 위해 C 코드를 호출하고 (기본 코드를 사용하여) C가 시작점을 등록 할 수있는 방법이 있습니다. 그런 다음 JS는 인수가있는 진입 점을 호출 할 수 있고 C 코드는 계산을 수행 한 다음 C가 표시 문자열을 JS에 대한 문자열로 반환합니다. C 코드에는 그래픽이없고 동적 메모리 할당 등이 없습니다. JS GUI 코드를 C#으로 변환하고 JS에서 동일한 작업을 수행하기 위해 C 코드를 사소한 수정 (# if)으로 사용하고 싶습니다. Pre가 지금합니다.

Answer 1/option2 나는 그가 "당신의 프로젝트 대 소비자 프로젝트"가 의미하는 바를 이해하지 못했고 어떻게/왜 그것이 하나의 dllimport이고 하나는 dllexport라는 것을 의미하는지 이해하지 못했습니다. DLL이 없으면 C 코드 루틴 만 있습니다. 그의 'PublicFunc'를 내 C 루틴으로 바꿔야 만하는 것처럼 보입니다. 맞습니까? 그리고 나는 그것이 'params'라고하는 많은 주장을 할 수 있을까요? 그러나 반환 형식이 지정되지 않은 경우 C#에 대한 응답을 어떻게 반환합니까? 'returntype'은 예약어입니까? 예를 들어 장소 소유자입니까? 아니면 DLL이 없기 때문에 트랙을 벗어나나요? BTW, C 코드는 테스트를 위해 DOS 프로그램으로 독립 실행 형으로 실행되도록 컴파일하는 모드를 가지고 있습니다.

이 작업을 수행하는 방법을 보여주는 간단한 예제 코드가 있습니까? MS VS 2010 Express를 지금 다운로드하고 있는데 아직 설치하지 않았습니다. 아마도 거기에 뭔가가있을 것입니까?

TIA!

+0

"귀하의 프로젝트"로 그는 C/C++ DLL 프로젝트에 대해 이야기하고 있습니다. 및 "소비자 프로젝트"는 DLL을 사용할 사용자 프로젝트입니다. 그의 예에서는 소비자가 DLL을 가져 오기 위해 C++을 사용한다고 가정하지만 소비자는 비슷한 (그러나 다른) 가져 오기 메커니즘을 가진 C#입니다. http://msdn.microsoft.com/en-us/library/aa984739%28VS.71 % 29.aspx –

+0

또한 C#을 사용하려면 C 코드의 DLL 내보내기가 필요합니다.'returntype'은 예약어가 아닙니다. 수출을 위해,'MYPROJECTAPI (int) foo();'는이 원본에 확장한다 :'extern "C"int __stdcall __declspec (dllexport) foo();'. 리턴 타입이'__stdcall __declspec'보다 먼저 나오지 않기 때문에'returntype' 매개 변수는 어리석은 짓입니다. 실제로 매크로에서 param을 모두 제거하고 다음과 같이 사용할 수 있습니다 : MYPROJECTAPI int foo();' –

+0

만약 내가 올바르게 읽고있다면, msdn 링크는 C++ -> C 링크를위한 것입니다. C# -> C에 대한 마법의 마법 주문 –

답변

0

내가 여기에 시작할 것 : MSDN on Interop

... 판 (2005/2008/2010) VS 필수를 선택해야합니다 ... 대답 모두에게 :)

+0

다른 곳에서 들었던 모든 내용은 Windows Phone이 C# -C 링키지를 수행하지 않는다고 했으므로 반대되는 정보가 있으면 알려 주시기 바랍니다. 네가 준 링크에서 나는 그것에 대해 아무것도 발견하지 못했다. 감사! –

3

감사합니다, 모든했다 대답의 작은 조각. 그래서 같은 질문으로 나를 뒤쫓을 수있는 사람들을 위해 필자가 작성한 코드를 필자가 필요로했던 것을 연계하여 실험해볼 것이다.

다음은 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

부록 ... 나는 최근에 Windows Phone 7 C#/XAML이 C/C++과의 연결을 지원하지 않는다는 것을 알아 냈습니다. 그래서 물 밖으로 나가고 싶었던 것을 불었습니다. . 분명히 모든 것이 C#에 있어야하며 C#으로 모든 그래픽 분석 코드와 데이터베이스를 다시 작성하지는 않으므로 Android로 이동할 것입니다.