link text的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!
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
我会从这里开始: MSDN on Interop
...一定要选择必备的VS版(2005/2008/2010)......:)
答案 2 :(得分:0)
附录......我最近发现Windows Phone 7 C#/ XAML不支持使用C / C ++进行链接,因此无法实现我想要做的事情。显然一切都必须在C#中,我不打算用C#重写我所有的图形分析代码和数据库,所以我将继续使用Android。