• 最近在写一个c#的sdk,用到了sqlite for ...System.DllNotFoundException Unable to load DLL SQLite.Interop.dll 在不能正常运行的客户机上面,尝试执行sqlite的官方例子,得到同样的结果,排除我代码的问题。 猜

    最近在写一个c#的sdk,用到了sqlite for .net!

    写完之后,打包给别人调用,结果在两台客户机上面死活不可用。然后开始查原因,最后定位到问题:

    System.DllNotFoundException Unable to load DLL SQLite.Interop.dll

    在不能正常运行的客户机上面,尝试执行sqlite的官方例子,得到同样的结果,排除我代码的问题。

    猜测是依赖的动态库缺失。

    dependence Walker查了一下:


    应该是编译sqlite的时候动态依赖了vc8的库文件。然后我把该目录的msvc80相关的动态库拷贝到SQLite.Interop.dll目录。居然不管用,这是怎么了?简直在侮辱我的智商。难道依赖的版本不是vc8?不清楚,后面未尝试链接其他版本的vc库。

    最后的办法,在代码中静态链接mfc相关库。下载了sqlite源码,自己重新编译一个静态链接vc库的sqlite动态库。编译选项的配置参考了这个博客

    1.方案一
      我baidu了一下,有个似乎可行的方案是这样的:将msvcm80.dll、msvcp80.dll、msvcr80.dll这几个动态库也放到运行目录下。这个方案我不太喜欢,于是我尝试自己动手解决问题。【这个方案我尝试有问题】


    2.方案二
      重新编译SQLite.Interop.dll,使其静态链接到VC++运行库。我下载了Sqlite的源码,用VS2010打开,截图如下:


       SQLite.Interop.2010这个项目是核心,我们需要对它的一些设置稍微做些修改,这些小修改我花了一些时间摸索才成功,这里就略去具体的摸索过程,直接给出摸索成果:
    (1)打开SQLite.Interop.2010项目属性页面,配置属性 -> C/C++ -> 代码生成 -> 运行库,该项设置为 多线程调试 (/MTd)。
    (2)继续 配置属性 -> 清单工具 -> 输入和输出 -> 嵌入清单,该项原来是“是”,改成“否”。
    (3)显示所有项目文件,然后找到SQLite.Interop.2010.props文件,并打开。删掉其中的<INTEROP_MIXED_NAME>配置节点。
    (4)从项目中移除“Resource Files”文件夹。
    (5)重新编译项目,生成的SQLite.Interop.dll便是我们所需要的。




    展开全文
  • 场景 最近弄个新项目,需要用到ORM。基本就是VS2017+C#+Dapper+Sqlite这样的...查看了下,packages目录下对应的System.Data.SQLite,System.Data.SQLite.Core文件内容都在,SQLite.Interop.dll也在。但就是没有...

    场景

    最近弄个新项目,需要用到ORM。基本就是VS2017+C#+Dapper+Sqlite这样的结构。从Nuget上下载相关的package,并关联好对应的数据结构。编译通过,但在运行时报错。如下图:
    这里写图片描述

    查看了下,packages目录下对应的System.Data.SQLite,System.Data.SQLite.Core文件内容都在,SQLite.Interop.dll也在。但就是没有生成到执行目录下。很费解。

    解决方案

    注意了下SQLite.Interop.dll所在目录,System.Data.SQLite.Core.1.0.109.1\build\net46下存在X64,X86两个文件夹。想到了项目工程编译选项设置的原因。于是:
    这里写图片描述

    根据需求选择对应的x86或x64,将会复制对应目录下的SQLite.Interop.dll至执行目录。成功运行。

    错误很小,但希望能帮到更多的人。

    展开全文
  • C#调用C++写的Native DLL

    2012-09-20 11:04:37
    C#部份 namespace testInteroperability { class MsgBoxTest { [DllImport("user32.dll")] static extern int MessageBox(IntPtr hWnd,string text, string caption,int type); pub

    C#部份

    namespace testInteroperability
    {
        class MsgBoxTest
        {
            [DllImport("user32.dll")]
            static extern int MessageBox(IntPtr hWnd,string text, string caption,int type);
    
            public static void testMB()
            {
                MessageBox(IntPtr.Zero,
                    "Please do not press this again.", "Attention", 0);
            }
        }
    }


    using System;
    using System.Runtime.InteropServices;
    using System.Text;
    
    namespace testInteroperability
    {
        class testMyDLL
        {
            /*
             * 内容:C#调用C++写的Native DLL的示例
             * 作者:kagula
             * 日期:20120920
             * 测试环境:VS2008SP1 .NET FRAMEWORK 3.5
             * 
             * 注意:
             * [1]你需要使用exeScope工具查看C++的函数导出后在DLL中的入口名称
             * 下面语句EntryPoint后跟的是C++函数导出后,在DLL中的入口名称
             * 因为c++的重载机制,同个函数名可以有不同的参数和返回值等等,为了区别开来,所以加了@@之类
             * 
             * [2]如果你经常修改C++DLL中的函数参数列表,VC会自动生成新的引用名称很不方便
             * 这时,你可以在C++项目中,[Add]->[New Item]->[Visual C++]->[Code]->[Module-Definition File(.def)]
             * 添加一个模块定义文件(.def),定义函数外部引用的名称。
             * 
             * [3]你必须修改你的DLL项目的DLL输出路径到C#程序的输出路径中
             * 例"<Solution所在路径>\<Solution名称>\<项目名称>\bin\Debug"
             * 
             * [4]C++的DLL项目同C#测试DLL的项目要放在同一个Solution中
             * 勾选C#项目属性[Debug]->[Enable Debuggers]->[Enable unmanaged code debugging]选项
             * 现在调试你的C#项目自动会进入到你在C++项目中下的断点。
             * 
             * 
             * 参考资料
             * [1]《Type Library Importer in Managed Code》
             * http://clrinterop.codeplex.com/releases/view/17579
             * [2]《How to copy a String into a struct using C#》
             * http://www.codeproject.com/Articles/7357/How-to-copy-a-String-into-a-struct-using-C
             * [3]《C#中具体如何调用Win32函数》
             * http://www.pinvoke.net
             * [4]《C++字符集问题终极分析(可解决乱码问题)》
             * http://hi.baidu.com/xddipuauedhkpqe/item/b59ee29082aaff35336eebcc
             */
    
            //测试基本调用,引用名称,为VC自动生成
            [DllImport(@"MyDLL.dll", EntryPoint = "?fnMyDLL@@YAHXZ")]  
            static extern int fnMyDLL();
    
            
            public static void test_fnMyDLL()
            {
                try
                {
                    int nR = fnMyDLL();
                    Console.WriteLine("test fnMyDLL()=" + nR);
                }
                catch (Exception e)
                {
                    //找不到动态链接库会抛出异常
                    Console.WriteLine(e.Message);
                }
            }
    
            //测试Primitive类型参数传入,引用名称在VC++项目的DEF文件中定义
            [DllImport(@"MyDLL.dll")]
            static extern void fnHaveMorePara(byte c,byte uc,
                short s,ushort us,
                int n,uint un,
                int l,uint ul,
                Int64 ll,Int64 ull,
                float f,double d,
                [MarshalAs(UnmanagedType.LPTStr)] string ss, [MarshalAs(UnmanagedType.LPWStr)] string ws);
    
            public static void test_fnHaveMorePara()
            {
                try
                {
                    fnHaveMorePara(1,2,3,4,5,6,7,8,
                        9L,10L,11.0f,12.0,
                        "ANSI String", "test_fnHaveMorePara[来自C#的字符串]");
                }
                catch (Exception e)
                {
                    //找不到动态链接库会抛出异常
                    Console.WriteLine(e.Message);
                }
            }
    
            //测试Primitive类型参数传出,引用名称在VC++项目的DEF文件中定义
            /*
             * [1]测试传入字节数组
             * [2]测试取字符串结果
             * [3]测试取int结果(其它原始数据类型的传出同int)
             */
            [DllImport(@"MyDLL.dll")]
            static extern void fnHaveMorePara2(IntPtr pData, 
                [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pWStr, 
                ref int n);
    
            unsafe public static void  test_fnHaveMorePara2()
            {
                byte[] data = new byte[2];
                data[0] = 1;
                data[1] = 2;
    
                fixed (byte* p = data)
                {
    
                    StringBuilder sb = new StringBuilder(255);
                    int n = 0;
                    fnHaveMorePara2((IntPtr)p, sb, ref n);
                    Console.WriteLine("1+2=" + n +"  sb="+sb.ToString());
                }
            }
    
            //测试结构数据的传入传出
            //C#负责分配内存,C++(DLL)负责往内存里填数据
            /*
             * Struct中的字符串成员转递给C++DLL用String类型,
             * [1]从C++DLL返回得用StringBuilder类型,问题是Struct里不能有StringBuilder类型的字符串类型。
             * 所要要返回struct里的String类型的东东,struct里必须是String类型,[2]而且外部函数声明时
             * 必须用ref。如果用out语法,传到C++里的struct里的String对象成员为空指针。
             * out 后面跟的结构里的成员只能是原始数据类型。
            */
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
            public struct StudentInfo
            {
                public int           id;
                [MarshalAs(UnmanagedType.LPWStr,SizeConst=256)]
                public String        name;
                public int age;
            }
            [DllImport(@"MyDLL.dll")]
            static extern void fnHaveMorePara3(StudentInfo siIn,ref StudentInfo siOut,
                ref StudentInfo siOut2);
            public static void test_fnHaveMorePara3()
            {
                StudentInfo si = new StudentInfo();
                StudentInfo siOut2 = new StudentInfo();
                si.id = 12;
                si.name = "来自C#的字符串!";
                si.age = 13;
    
                //分配足够长度的内存,让C++程序能够往里填要返回的字符串。
                //若C++程序地址越界(超出C#所分配实际内存长度),C#程序会抛出OutOfMemory异常。
                siOut2.name = new String('\0',256);
    
                fnHaveMorePara3(si, ref si, ref siOut2);
                Console.WriteLine("id="+si.id);
                Console.WriteLine("name=" + si.name);
                Console.WriteLine("age=" + si.age);
    
                Console.WriteLine("siOut2 id=" + siOut2.id);
                Console.WriteLine("siOut2 name=" + siOut2.name);
                Console.WriteLine("siOut2 age=" + siOut2.age); 
            }
            //测试union结构参数的传入传出
            //暂时不会用到,故省略
    
            //测试2D数组的传递
            [DllImport(@"MyDLL.dll")]
            static extern void AddMatrix4x4(int [,] s1,int [,] s2,ref int[,] d);
            public static void test_fnHaveMorePara4()
            {
                int[,] s1 = new int[4,4];
                int[,] s2 = new int[4,4];
                int[,] d = new int[4, 4];
                for(int i=0;i<4;i++)
                    for (int j = 0; j < 4; j++)
                    {
                        s1[i,j]  = i;
                        s2[i, j] = j;
                        d[i, j] = i * j;
                    }
    
                AddMatrix4x4(s1, s2, ref d);
                Console.WriteLine("AddMatrix4x4 D[3][3]= >" + d[3,3]);
            }
    
            //测试C++对C#的回调
            delegate bool FromDLLCallBack(int r);
            [DllImport(@"MyDLL.dll")]
            static extern void Add(FromDLLCallBack func, int s1,int s2);
            static bool _FromDLLCallBack(int r)
            {
                Console.WriteLine("_FromDLLCallBack =>" + r);
                return false;
            }
            public static void test_fnHaveMorePara5()
            {
                Add(_FromDLLCallBack, 1, 2);
            }
        }
    }

    C++部份,模块定义文件

    LIBRARY	"MyDLL"
    EXPORTS
    fnHaveMorePara  @2
    fnHaveMorePara2 @3
    fnHaveMorePara3 @4
    AddMatrix4x4    @5
    Add             @6

    C++部份,头文件

    #ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #endif
    
    
    //测试简单函数的调用
    MYDLL_API int  fnMyDLL(void);
    
    //测试原始数据类型参数列表的传入
    MYDLL_API void fnHaveMorePara(char c,unsigned char uc,
    							  short s,unsigned short us,
    							  int n,unsigned int un,							  
    							  long l,unsigned long ul,
    							  long long ll,unsigned long long ull,
    							  float f,double d,
    							  char* pStr,wchar_t* pWStr);
    
    //测试原始数据类型参数的返回
    /*
    [in]  pData   字节型数组指针
          pWStr   要返回字符串指针
    [out] pWStr,n
          n       pData数组第一个单元的值 + pData数组第二个单元的值
    */
    MYDLL_API void fnHaveMorePara2(void* pData,wchar_t* pWStr,int* n);
    
    //测试数据结构对象的传入传出
    typedef struct _StudentInfo
    {
        int      id;
        wchar_t* name;
        int      age;
    } StudentInfo;
    
    MYDLL_API void fnHaveMorePara3(StudentInfo siIn,StudentInfo* siOut,
    							   StudentInfo* siOut2);
    
    /*
    功能:四阶矩阵加法
    目的:二维数组传递
    备注:int s1[4][4]可以声明为int *s1,
          这时对s1二维数组进行引用可以采用s1[i*4+j]形式,i、j的定义域为[0,3]
    */
    MYDLL_API void AddMatrix4x4(int s1[4][4],int s2[4][4],int **_d);
    
    //测试回调功能
    typedef BOOL (CALLBACK *FromDLLCallBack) (int r);
    MYDLL_API void Add(FromDLLCallBack func,int a,int b);

    C++部份,源文件

    // MyDLL.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #include "MyDLL.h"
    
    #include "stdio.h"
    #include <string.h>
    
    #include <iostream>
    /*
    环境:VS2008SP1
    项目设置:新建DLL项目时,勾选[Additional options]的[Export Symbols]选项
    */
    MYDLL_API int fnMyDLL(void)
    {
    	return 42;
    }
    
    MYDLL_API void fnHaveMorePara(char c,unsigned char uc,
    							  short s,unsigned short us,
    							  int n,unsigned int un,							 
    							  long l,unsigned long ul,
    							  long long ll,unsigned long long ull,
    							  float f,double d,
    							  char* pStr,wchar_t* pWStr)
    {
    	printf("[char,unsigned char]=>%c,%c\n",c,uc);
    	printf("[short,unsigned short]=>%d,%d\n",s,us);
    	printf("[int,unsigned  int]=>%d,%d\n",n,un);
    	printf("[long,unsigned long]=>%d,%d\n",l,ul);
    	printf("[long long,unsigned long long]=>%I64d,%I64d\n",ll,ull);
    	printf("[float,double]=>%d,%d\n",c,uc);
    
    	printf("[char *]=>%s\n",pStr);
    	//打印中文会乱码,还需要做字符集编码转换,但这不是本文的重点,故忽视。
    	wprintf(L"[wchar_t *]=>%s\n",pWStr);
    }
    
    MYDLL_API void fnHaveMorePara2(void* pData,wchar_t* pWStr,int* n)
    {
    	if(pData!=NULL)
    	{
    		char *pC = (char *)pData;
    		std::wstring ws=L"Unicode String[来自DLL的字符串]";
    		*n = (int)(pC[0] + pC[1]);
    		wcsncpy(pWStr,ws.c_str(),255);
    	}
    }
    
    /*
    功能:
    目的:结构对象的传递
    备注:
    */
    MYDLL_API void fnHaveMorePara3(StudentInfo siIn,StudentInfo* siOut,StudentInfo* siOut2)
    {
    	printf("SI(1)->id=%d\n",siIn.id);
    	wprintf(L"SI(1)->name=%s\n",siIn.name);
    	printf("SI(1)->age=%d\n",siIn.age);
    
    	siOut->id=21;
        //不能对siOut->name操作,因为没有分配足够长度的内存
    	siOut->age=22;
    
    	siOut2->id = 31;
    	//C#对应的是String类型所以不能给wchar_t*类型对象赋值,
    	//否则在C#里引用这个对象会抛出OutOfMemeoryException。
    	if(siOut2->name!=NULL)
    		wcsncpy(siOut2->name,L"来自C++DLL的名字",255);
    	siOut2->age = 32;	
    }
    
    
    MYDLL_API void AddMatrix4x4(int s1[4][4],int s2[4][4],int **d)
    {
    	for(int i=0;i<4;i++)
    	{
    		for(int j=0;j<4;j++)
    		{
    			(*d)[i*4+j] = s1[i][j] + s2[i][j];
    		}
    	}
    	printf("d[3][3]=%d\n",(*d)[15]);
    }
    
    MYDLL_API void Add(FromDLLCallBack func,int a,int b)
    {
    	BOOL bR = (*func)(a+b);
    	if(bR==1)
    		printf("C#返回True!\n");
    	else if(bR==0)
    		printf("C#返回False!\n");
    }


    展开全文
  • .Net工程在Ubuntu 14.04中使用mono运行,...ManagerDB.cs exc=System.DllNotFoundException: SQLite.Interop.dll at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(S...

    .Net工程在Ubuntu 14.04中使用mono运行,发现数据库相关报错:

    ManagerDB.cs exc=System.DllNotFoundException: SQLite.Interop.dll
      at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(System.Data.SQLite.SQLiteConfigOpsEnum)
      at System.Data.SQLite.SQLite3.StaticIsInitialized () [0x0001d] in <10695578209d406fa38cf712bf41105d>:0 
      at System.Data.SQLite.SQLiteLog.Initialize (System.String className) [0x00026] in <10695578209d406fa38cf712bf41105d>:0 
      at System.Data.SQLite.SQLiteConnection..ctor (System.String connectionString, System.Boolean parseViaFramework) [0x00046] in <10695578209d406fa38cf712bf41105d>:0 
      at System.Data.SQLite.SQLiteConnection..ctor (System.String connectionString) 

    检查发现bin包下有两个文件:

    • System.Data.SQLite.dll
    • SQLite.Interop.dll

    查找相关资料后,发现还是在指定linux环境下编译相关的库文件比较靠谱,这样在Windows和Linux平台都能共同使用,最多可以再额外写个配置,用于不同平台、结构下的指定启动,但为了快速解决问题,暂时直接在目标linux平台编译:

    下载源码

    https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 官方地址下载对应的源代码(相关内容可能发生变化,以网站实际内容为准):

    
    List of Release Packages
    Source Code
     	sqlite-netFx-source-1.0.112.0.zip
    (6.63 MiB)		This ZIP archive contains all current source code for System.Data.SQLite 1.0.112.0 (3.30.1) combined into a single archive file.
    (sha1: 8ea203781925472c0dbb1c8b9e8b8f7a3575f7bc)
     	sqlite-netFx-full-source-1.0.112.0.zip
    (13.06 MiB)		This ZIP archive contains all current source code for System.Data.SQLite 1.0.112.0 (3.30.1) and the extra files needed to run the unit test suite, combined into a single archive file.
    (sha1: 7ea090b8a283090372d4dc282ff109c7bebb40a4)

    编译sqlite-netfx-full-source

    参考指令如下:

    sudo apt-get update
    sudo apt-get install build-essential
    cd <source root>/Setup
    chmod +x compile-interop-assembly-release.sh
    ./compile-interop-assembly-release.sh

    编译完成后,在<source root>/bin/2013/Release/bin目录可以看到两个文件:

    • libSQLite.Interop.so
    • SQLite.Interop.dll

    默认貌似都有可执行权限,可以将libSQLite.Interop.so的可执行权限取消:

    chmod -x libSQLite.Interop.so

    使用libSQLite.Interop.so

    将编译生成的libSQLite.Interop.so拷贝至指定运行目录,执行成功,数据库正常加载。

     

    参考资料

     

    原英文内容ShortCut

    Using System.Data.SQLite under Linux and Mono

    If you want to use the lean, mean and fast SQLite database in your .NET programs under Linux and Mono, using Mono.Data.SQLite might seem like the obvious choice, but you can actually do better. With a little effort, you can use System.Data.SQLite under Linux+Mono (and probably macOS too). There a couple of key benefits to be gained from this:

    • If you build SQLite.Interop on the Mono machine, you get functionality not present in Mono.Data.SQLite, like SQLite virtual table support (see this answer from Joe Mistachkin).
    • The System.Data.SQLite NuGet package is actively maintained, whereas Mono.Data.SQLite is rarely updated. As of October 2016, the former is about a month old, but the latter is older than 1.5 years. This means that bug fixes (e.g. DateTime conversion throwing exceptions when columns have time zone info) remain unreleased for Mono.Data.SQLite.
    • In Mono.Data.SQLite, classes don’t have the same capitalization as System.Data.SQLite, so you can’t use the same source code as you do in .NET and just leave both the Mono.Data.SQLite and the System.Data.SQLite DLLs in your program directory. You’d have to resort either to #defines and conditional compilation or to using Mono.Data.SQLite under both .NET and Mono.

    Building System.Data.SQLite Interop under Linux

    There’s no System.Data.SQLite package for Linux, so you’ll have to build it yourself on your target Linux machine. You can build using this procedure, which is tested in Raspbian Jessie on a Raspberry Pi 3 and Ubuntu 16.04.1 on a PC:

    • Download System.Data.SQLite full source code from this download page. There’s a ton of files there, and the one you should look for is named something like sqlite-netFx-full-source-<version no>.zip.
    • Unzip it and transfer it to a directory on your Linux machine. In the rest of this description, I’ll call this directory “<source root>”.
    • Issue these commands in a Linux terminal:
    sudo apt-get update
    sudo apt-get install build-essential
    cd <source root>/Setup
    chmod +x compile-interop-assembly-release.sh
    ./compile-interop-assembly-release.sh
    • Now, you will have a freshly built library file called libSQLite.Interop.so in the <source root>/bin/2013/Release/bin directory. This file might have execution permission which isn’t relevant for a library, so remove it by
      chmod -x <source root>/bin/2013/Release/bin/libSQLite.Interop.so
    • Copy libSQLite.Interop.so the directory where your Mono/.NET application’s binaries reside (not the x64 or x86 subdirectories containing SQLite.Interop.dll), and you’re set to go.

    And that, ladies and gentlemen, is how we do that!

    展开全文
  • 在.NET CF(WM 6)中使用了System.Data.SQLite,程序在个别手机(WM6.1和6.5)上运行异常,异常提示为unsafenativemethods.sqlite3_open_interop方法。如果你使用的是早期版本的System.Data.SQLite,那么在WM6.1或高版本...

    在.NET CF(WM 6)中使用了System.Data.SQLite,程序在个别手机(WM6.1和6.5)上运行异常,异常提示为unsafenativemethods.sqlite3_open_interop方法。如果你使用的是早期版本的System.Data.SQLite,那么在WM6.1或高版本的手机上可能会出现此异常。

    2009111314220124.jpg

    System.Data.SQLite的Version History发现了这样的描述:

    1.0.50.0 - June 27, 2008
    Enhanced the mergebin utility to work around the strong name validation bug on the Compact Framework.  The old workaround kludged the DLL and caused WM6.1 to fail to load it.  This new solution is permanent and no longer kludges the DLL. 


    我使用的是1.0.48版,这个版本包括了SQLite引擎和ADO.NET的封装。作者把它们合并到了一个dll文件中。这个dll同时支持native code或managed code调用。但在1.0.50版本的更新中,已经取消了这样的方式。 即ADO.NET provider for SQLite和SQLite.Interop分开单独提供。所以后续版本的System.Data.SQLite.dll文件仅是一个ADO.NET provider for SQLite,不包含SQLite的源码,而nativer的封装在SQLite.Interop.xxx.dll这样的文件中。System.Data.SQLite.dll使用时需要p/invoke SQLite.Interop.xxx.dll。

    引用了新的程序集后,没有发现上面这个异常。

    作者在后续的版本中提供了ManagedOnly的System.Data.SQLite.dll,使用时需要native sqlite3.dll or Linux shared library from http://www.sqlite.org,我在asp.net 中测试可以使用,但在.NET CF中异常。看来这个ManagedOnly应该不支持arm平台。

     

    标签:Windows Mobile,.NET CF,SQLite,System.Data.SQLite
    http://chy710.cnblogs.com

     

    展开全文
  • 使用托管语言调用Native dll必备,写的很细致,可以作为字典来查的。
  • 之前写过一篇小短文:《[科普小短文]在C#中调用C语言函数》,是在Windows平台下基于Microsoft.Net的一个例子。今天我们来做另外一个小例子,是在Linux平台下基于Mono的例子。关于在C#中调用C语言函数的具体技术P/...
  • 《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》官方博客 一篇用C++/CLI讲述在托管委托(delegate)和非托管函数指针之间相互转化的文章 我们的图书《精通.NET互操作》出版有一个月的时间了,有...
  • Kotlin Native编程探索

    2018-04-14 13:02:02
    Kotlin简介 Kotlin是JetBains开发一种基于JVM的新的编程语言。Kotlin可以编译成字节码运行在JVM上,与Java完美兼容,并在...Kotlin Native利用LLVM来将Kotlin代码编译成本地机器代码,使得Kotlin可以脱离JVM运行。...
  • 最近一直在忙.NET Native相关的事情(主要是MCG),但是又因为保密的原因不能在Blog中提到。上个星期Build终于发布(可惜没有去成,team名额太少),我也终于可以谈下.NET Native的一些东西了,呵呵。 如果大家还...
  • COM Interop入门

    2008-04-15 23:47:00
    [引子] 在C#程序员的字典中,COM Interop意味着在C#代码中,调用COM。...当开发者们迁徙到C#之后,...[方法] 当手捧一个COM组件后,需要分三步完成一个最简单的COM interop 使用tlbimp产生一个.net的dll模块(称为Intero
  • 解决System.Data.SQLite兼容32位和64位问题 将当前说明文档的目录下的x64、x86目录和System.Data.SQLite.dll...代码,必须配合Native Interop dll才能使用 注意:当前使用的System.Data.SQLite.dll是版本是1.0.86.0
  • 本例使用 ISO C++ 建立一个类 NativeLib, 计算并打印两个位置的直线距离,然后使用 C++/CLI 封装在一个 NativeLibWrap 托管类里,提供给 C# 主程序调用。// Native
  • Java调用C#的dll是通过C++作为桥梁,JNI—>C++的dll(clr方式运行)—>C#的dll   以下为本次测试的配置环境:  系统:win7 64位  Java开发环境(均为64位):JDK1.8、eclipse  C++开发环境:VS2015  整个...
  • 最近在论坛上经常看到一些基本的interop的问题,给我动力写完之前的.net interop入门系列,给刚刚涉足.NET interop的朋友们一个大体上的概念。每每谈及.NET interop,我的脑中总是出现下面一幅图: 该图代表了.net ...
  • 最近在论坛上经常看到一些基本的interop的问题,给我动力写完之前的.net interop入门系列,给刚刚涉足.NET interop的朋友们一个大体上的概念。每每谈及.NET interop,我的脑中总是出现下面一幅图:该图代表了.net ...
  • 其中clrzmq是基于libzmq的Interop包装, NetMQ是100%C#的zmq实现(基于AsyncIO组件)。以上两种组件我都有过应用,孰优孰劣各有千秋,本文就不详谈了。   回归正题,netcore下使用zmq首先也是想到引
  • 这几天需要写一个用到Java模块的程序,但是Java是不可能写的,这辈子都不可能写的,只能搞搞interop了。目前市面上已有的基本上是IKVM.NET和JNBridgePro,后者没太...
1 2 3 4 5 ... 20
收藏数 814
精华内容 325