簡體   English   中英

C# - C互操作性

[英]C# - C interoperability

鏈接文本的Q / A非常接近我正在尋找的內容,但我只是開始使用C#並且需要更多填寫,並且可能有一些關於最佳方法的提示。

我有一個我用Javascript寫的PalmPre / webOS的應用程序,其中一部分用C語言編寫,以實現可移植性,而不是性能。 它做Lear Jet性能計算。

在webOS世界中,C代碼(插件)進入自己的進程,JS有一種方法可以調用和調用C代碼(使用'main')來啟動進程,C可以注冊入口點。 然后JS可以使用一些參數調用入口點,C代碼進行計算,然后C返回指向JS的數字字符串的指針以供顯示。 C代碼沒有圖形,沒有動態內存分配等。我想基本上將JS GUI代碼轉換為C#,並使用C代碼對C#進行微調(#if's)來做與JS相同的事情。 Pre現在做了。

答案1 / option2我認為最好,但我不明白他的意思是“你的項目與消費者項目”以及如何/為什么這意味着一個是dllimport,一個是dllexport,我沒有DLL ,我只有C代碼例程。 看起來我要做的就是用我的C例程替換他的'PublicFunc',對吧? 我可以有一些args,它說'params'? 但是沒有指定返回類型,我將如何返回C#的答案? “返回型”是一個保留字嗎? 或者一個例子占位符? 或者我離開賽道因為我沒有DLL? 順便說一下,C代碼確實有一種編譯模式可以獨立運行作為DOS程序進行測試。

是否有任何簡單的示例代碼說明如何執行此操作? 我現在正在下載MS VS 2010 Express,還沒有安裝它。 也許那里有什么東西?

TIA!

感謝所有回答的人,一切都收到了答案。 所以對於那些可能會跟我問相同問題的人,我會發布我寫的代碼來試驗我需要的鏈接。

//這是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;
}
}

我將從這里開始: 在Interop上的MSDN

...一定要選擇必備的VS版(2005/2008/2010)...... :)

附錄......我最近發現Windows Phone 7 C#/ XAML不支持使用C / C ++進行鏈接,因此無法實現我想要做的事情。 顯然一切都必須在C#中,我不打算用C#重寫我所有的圖形分析代碼和數據庫,所以我將繼續使用Android。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM