Tag: .net

在.NET中使用C回调函数

我正在使用.NET内部的C库这一切都很好用。 但我遇到了回调函数的麻烦。 我有这个C代码: Bool someCallBack(const char *name, int reason) { //some logic here return True; } int main(int argc, char **argv){ SetCallback(someCallBack) } 在头文件中,SetCallback定义为: typedef Bool (*CallbackType)(const char *name, int reason); #define DLL_USE __declspec(dllimport) DLL_USE void SetCallback(CallbackType callBack); 当我执行一个触发回调的函数时,这一切都在C中正常工作。 现在我想从.NET中做到这一点 在.NET中我有这个代码 _ Public Shared Sub SetCallback(ByVal callBack As CallbackType) End Sub Delegate Function CallbackType(ByVal name […]

在unit testing中使用StringBuilder进行PInvoking

我有一个C DLL我是PInvoking。 主要目标是获取39个字符的GUID字符串,例如abcd-abcd-abcd-abcd-abcd-abcd-abcd-abcd 。 我首先调用一个方法来获取这个字符串的大小,我希望它是39个字符,然后我调用另一个函数传递一个容量为39的StringBuilder : [DllImport(“test.dll”)] public static extern int get_size(); [DllImport(“test.dll”)] public static extern void get_string(StringBuilder result); 我的代码看起来像这样: int size = get_size(); // Returns 40, because it includes the null terminating character. var result = new StringBuilder(size – 1); // Gives it a capacity of 39. Subtracting 1 here because this does not […]

从C#调用C DLL方法的正确方法

我试图从第三方DLL执行一些方法(在这种特殊情况下,rdOnAllDone),用C语言编写,然后查看头文件,我发现: #ifndef TDECLSDONE #ifdef STDCALL #define CCON __stdcall #else #define CCON __cdecl #endif #define TDECLSDONE #endif #define DLLIMP __declspec (dllimport) DLLIMP int CCON rdOnAllDone (void(CCON *)(int)); 在调用一种方法来调用这个方法后,我做了这个: [DllImport(“sb6lib.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern int rdOnAllDone(Delegate d); public delegate void rdOnAllDoneCallbackDelegate(); private static void rdOnAllDoneCallback() { Console.WriteLine(“rdOnAllDoneCallback invoked”); } 除了我无法获取int参数之外,该方法被正确调用。 所以我尝试像这样添加输入参数int [DllImport(“sb6lib.dll”, CallingConvention = CallingConvention.Cdecl)] […]

有没有librtmp c#.net包装器?

有没有librtmp c#.net包装器?

.AMVvideo编码器/转换器?

我正在寻找一个可以将输入文件编码为amv格式输出的转换器。 我找到了这个项目,但它看起来有些过时而且没有维护。 问题在于它支持非常有限的各种输入文件类型。 你知道一个坚固可靠的amv编码器(任何可以从.NET调用的API或工具),或者你能推荐我提到的那个吗? UPDATE 我使用FFmpeg作为我的所有其他类型的应用程序,问题是FFmpeg根本不支持.AMV格式,这是我的应用程序中的一个关键输出文件。 UPDATE 任何人都知道我是否以及如何将上面建议的过时amv-codec与官方FFmpeg合并? 更新 你是一个愿意贡献的C开发者吗? 请参考这张票,对于一个体面的C开发人员来说,这看起来很容易。

C#中的封送C数组

可能重复: 在c#中编组c结构 实际C结构: typedef struct procedure { char code[8]; }procedure; typedef struct p45_cldxed24 { procedure p45_cldxed[8]; }p45_cldxed24; p45_cldxed24的等效C#结构是什么? 具体来说,你将如何编组arrays? 检查一下 它是否正确? [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct p45_cldxed24 { [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct,SizeConst = 8,SizeParamIndex=0)] procedure[] p45_cldxed; }

P / Invoke调用中的AccessViolationException

我正在通过P / Invoke调用编写一个小的zlib包装器。 它在64位目标(64位C#构建,64位DLL)上运行完美,但在32位目标(32位C#构建,32位DLL)上抛出AccessViolationException。 这是抛出exception的C#签名和代码: [DllImport(Program.UnmanagedDll, CallingConvention = CallingConvention.Cdecl)] private static extern ZLibResult ZLibDecompress(byte[] inStream, uint inLength, byte[] outStream, ref uint outLength); internal enum ZLibResult : byte { Success = 0, Failure = 1, InvalidLevel = 2, InputTooShort = 3 } internal static ZLibResult Decompress(byte[] compressed, out byte[] data, uint dataLength) { var len = […]

从托管应用程序调用的本机DLL的堆栈溢出

当我调用本机DLL时,我从我的应用程序中得到了臭名昭着的0xC00000FD (堆栈溢出)exception。 这是通过Windows CE 5(SH4处理器)上的托管C#应用程序完成的。 使用相同的托管应用程序为Windows XP编译相同的DLL,一切正常(没有溢出)。 DLL中的例程正在进行一些非常复杂的递归,这最终导致溢出,但同样,它在PC上运行良好。 看起来我可能只需要在构建DLL时调整堆栈大小? 我相信使用Visual C编译器时,CE和XP的默认堆栈大小都是1MB(我使用Visual Studio 2005,如果这很重要)。 如果它们都默认为相同的大小,我不确定为什么会溢出而另一个不会。 我尝试使用/ F编译器标志和/ STACK链接器标志调整堆栈大小,但似乎没有做任何事情。 我也不完全清楚我可以在DLL中指定堆栈大小,而是可执行文件必须设置它。 但是,如果是这样的话,我如何调整托管进程在调用本机DLL时使用的堆栈大小?

从Windows C函数返回字符串

我是C和C ++中纯Windows API级函数的完全新手,并且最近一直在尝试使用.NET互操作性。 我已经构建了一个简单的库,它已经成功地将数值(int / float等)返回给.NET调用者,但是我没有运气好的字符串。 我尝试了各种不同的数据类型,但似乎都没有:LPSTR,LPCSTR,LPCTSTR和LPCWSTR。 不可否认,我没有尝试过char *。 此外,一旦设置了一个方法来返回一个字符串,它是否需要.NET作为特定数据类型进行编组,还是可以简单地直接读入System.String对象? 我已经尝试解析为IntPtr然后转换为字符串,但这不起作用。

如何使用AmazonS3.net sdk重命名存储桶中的文件夹

我知道s3并不真正支持文件夹概念。 复制/删除所有文件应该工作。 但也许有人知道一种更简单的方法(我只是没有在SDK中找到它) 更新/解决方案: 以下代码对我有用。 using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(“xxx”, “yyy”)) { ListObjectsRequest listRequest = new ListObjectsRequest(); listRequest.WithBucketName(“ytimusic”) .WithPrefix(“M” + oldOWnerId.ToString()+”/”); // get all objects inside the “folder” ListObjectsResponse objects = client.ListObjects(listRequest); foreach (S3Object s3o in objects.S3Objects) { // get the acl of the object GetACLRequest aclRequest = new GetACLRequest(); aclRequest.WithBucketName(“thebucket”) .WithKey(s3o.Key); GetACLResponse getAclResponse = […]