从C调用C#DLL;联系问题

时间:2013-12-03 16:31:21

标签: c# c visual-studio-2012 dll

我正在使用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代码中的'添加'原型是否是我所需要的?

2 个答案:

答案 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位