我正在使用VS2012并尝试从我编写的C DLL中调用C#项目中的函数。 C DLL由外部应用程序(Thunderbird)调用。
我找到了Unmanaged Exports页并按照说明操作。在这个过程中,我的C#项目必须设置为.net4和x86,以便尽可能地编译和链接所有内容。但是我有一个我无法解决的链接器错误,因为这对我来说是一个未知的领域,我可能只是在做一些愚蠢的事情。
在我的C#中我有;
using RGiesecke.DllExport;
namespace StreamAttacher
{
class Test
{
[DllExport("add", CallingConvention = CallingConvention.Cdecl)]
public static int TestExport(int left, int right)
{
return left + right;
}
}
}
在我的C中我有
#include<stdio.h>
int add(int left, int right); //in c#
__declspec(dllexport)char* strTest2()
{
int i = add(2,3);
char *p = "C:\\Work\\Mozilla\\Test dir\\testfile.zip";
return p;
}
C项目在其外部依赖项中引用C#项目。
在构建时,我收到链接器错误“错误LNK2019:函数_strTest2中引用了未解析的外部符号_add”
如果我使用DllExp查看C#DLL,那么我看不到任何导出。我是不是该?我期待看到“添加”功能,但它不存在,并且当我自己构建C#DLL时也不会产生任何错误。
另外,如果事情在链条上进一步发挥作用,那么C代码中的'添加'原型是否是我所需要的?
答案 0 :(得分:1)
我最近尝试出于同样目的导出C#函数(使用RGiesecke的库和其他方法),无法使其工作并发现它非常多毛。如果您可以选择尝试其他方法,我建议您考虑将C ++ / CLI库编写为中间版。对我来说,这是一个更加可互换的解决方案。
这是一个不错的教程:http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes
答案 1 :(得分:0)
您可能希望使用字符串参数的编组属性定义 c#签名。
[DllImport(@"c:\GDAit.dll")]
public static extern long TransGeogPt([MarshalAs(UnmanagedType.LPStr)] string sGridFile, long lDirection, double dLat, double dLong, ref double pdLatNew, ref double pdLongNew, ref double pdLatAcc, ref double pdLongAcc);
[DllImport(@"c:\GDAit.dll")]
public static extern long TransProjPt([MarshalAs(UnmanagedType.LPStr)] string sGridFile, long lDirection, double dLat, double dLong, long lZone, ref double pdLatNew, ref double pdLongNew, ref double pdLatAcc, ref double pdLongAcc);
我还会捎带Mark Sowul的回答,并试着用StdCall而不是Cdecl来打电话。
另外,作为预防措施,我可能需要仔细检查以确保编译器设置为编译 x86 代码,以防其编译为 64位