gpt4 book ai didi

C# - C 互操作性

转载 作者:行者123 更新时间:2023-11-30 16:31:44 29 4
gpt4 key购买 nike

问答 link text非常接近我正在寻找的东西,但我只是从 C# 开始,需要更多的填充,可能还需要一些关于最佳继续方式的提示。

我有一个应用程序是用 Javascript 为 PalmPre/webOS 编写的,其中一部分是用 C 语言编写的,目的是为了可移植性,而不是为了性能。它执行 Lear Jet 性能计算。

在 webOS 世界中,C 代码(插件)进入自己的进程,JS 有一种方法可以调用和调用 C 代码(使用“main”)来启动进程,C 可以注册入口点。然后JS可以调用一个带参数的entrypoint,C代码做一个计算,然后C返回一个指向一串数字的指针给JS显示。 C 代码没有图形,没有动态内存分配等。我想从本质上将 JS GUI 代码转换为 C#,并使用 C 代码稍作调整(#if's)让 C# 执行与 JS 相同的操作Pre 现在可以了。

答案 1/选项 2 我认为是最好的,但我不明白他所说的“你的项目与消费者项目”是什么意思,以及这如何/为什么意味着一个是 dllimport,一个是 dllexport,我不明白有一个 DLL,我只有 C 代码例程。看起来我所要做的就是用我的 C 例程替换他的“PublicFunc”,对吧?我可以在上面写着“params”的地方有很多参数吗?但是没有指定返回类型,我将如何返回 C# 的答案? “returntype”是保留字吗?或者一个示例占位符?还是因为我没有 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;
}
}

关于C# - C 互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4719359/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com