zoukankan      html  css  js  c++  java
  • C++通过DLL调用C#代码

    本文将介绍C++中通过DLL来调用C#代码。

    首先建立C#的“类库”工程CShapeDLL

    然后输入如下代码:

    //C++通过DLL调用C#代码
    //http://blog.csdn.net/morewindows/article/details/8678431
    //By MoreWindows( http://blog.csdn.net/MoreWindows )
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace CShapeDLL
    {
        public class CMyAddClass
        {
            private int m_nNumber1;
            private int m_nNumber2;
            public int Number1
            {
                set { m_nNumber1 = value; }
                get { return m_nNumber1; }
            }
            public int Number2
            {
                set { m_nNumber2 = value; }
                get { return m_nNumber2; }
            }
            public int AddFunc()
            {
                return m_nNumber1 + m_nNumber2;
            }
        }
    
        public class CMyWriteLine
        {
            private string m_strText;
            public string Text
            {
                set { m_strText = value; }
                get { return Text; }
            }
            public void WriteLineFunc()
            {
                Console.WriteLine(m_strText);
            }
        }
    }
    // By MoreWindows( http://blog.csdn.net/MoreWindows )

    这里有两个类,一个是MyAddClass类,是用来做加法运算的,另一个是CMyWriteLine,用来输出文本的。

    然后以C++控制台程序为例,C++代码如下:

    //C++通过DLL调用C#代码
    //http://blog.csdn.net/morewindows/article/details/8678431
    #using "CShapeDLL\\CShapeDLL\\bin\\Debug\\CShapeDLL.dll"
    //#using "CShapeDLL\\CShapeDLL\\bin\\Release\\CShapeDLL.dll"
    #include <stdio.h>
    #include <conio.h>
    using namespace CShapeDLL;
    int main()  
    {  
        printf("    C++通过DLL调用C#代码\n");          
        printf(" - By MoreWindows( http://blog.csdn.net/morewindows/article/details/8678431 ) -\n\n");   
    
        CMyWriteLine ^ writeLineClass = gcnew CMyWriteLine;
        writeLineClass->Text = "使用C# 的CMyWriteLine示范";
        writeLineClass->WriteLineFunc();
        writeLineClass->Text = "By MoreWindows (http://blog.csdn.com/MoreWindows)";
        writeLineClass->WriteLineFunc();
        writeLineClass->Text = "http://blog.csdn.net/morewindows/article/details/8678431";
        writeLineClass->WriteLineFunc();
    
        printf("\n   ----------------------------------   \n");
    
        CMyAddClass ^ addClass = gcnew CMyAddClass;
        addClass->Number1 = 3;
        addClass->Number2 = 5;
        printf("使用C# 的CMyAddClass示范\n");
        printf("%d + %d = %d\n", addClass->Number1, addClass->Number2, addClass->AddFunc());
        getch();
        return 0;
    }
    //By MoreWindows( http://blog.csdn.net/MoreWindows )

    编译,出错。提示如下:

    fatal error C1190: 托管目标代码需要“/clr”选项

    好吧,修改下,在“属性”->“配置属性”->“常规”->“公共语言运行库支持”中选取“公共语言运行库支持(/clr)”。如下图所示(图片访问不了?请访问http://blog.csdn.net/morewindows/article/details/8678431)。

     

    再编译,又出错!提示如下:

    1>正在编译...

    1>cl: 命令行error D8016 :“/MTd”和“/clr”命令行选项不兼容

    1>项目: error PRJ0002 : 错误的结果2 (从“e:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe”返回)。

    好吧,再修改下,“属性”->“配置属性”->C/C++->“代码生成”->“运行时库”中选取“多线程DLL (/MD)”。如下图所示(图片访问不了?请访问http://blog.csdn.net/morewindows/article/details/8678431)。

     

    再编译,成功了。运行下,又出错了——“应用程序发生异常未知的软件异常(0xe0434f4d),位置为 0x7c812fd3“。如下图所示(图片访问不了?请访问http://blog.csdn.net/morewindows/article/details/8678431)。

     

    这个怎么解决了,很简单,这是因为EXE程序没能加载到DLL文件导致的,将CShapeDLL.dll拷贝到EXE程序所在目录下,再运行,成功了。结果如下图所示(WinXP及Win7均可以运行):

     

    转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678431

  • 相关阅读:
    Springboot系列 1
    从-1起步学习SpringBoot
    WinForm与WPF下跨线程调用控件
    利用FileSystemWatcher实现磁盘文件监控
    HashTable初次体验
    【原创】国网远程加密机认证软件开发2(认证步骤及代码)
    【原创】国网远程加密机认证软件开发1(相关说明)
    第一次做socket的一些心得
    ArchLinux 安装记录
    oh my zsh安装
  • 原文地址:https://www.cnblogs.com/dgy5554/p/3973410.html
Copyright © 2011-2022 走看看