[英]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.