zoukankan      html  css  js  c++  java
  • Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    From: Sample: Mixing Unmanaged C++, C++/CLI, and C# code

    We have this simple unmanaged C++ class UnmanagedFoo:

    E:\sample\vc\mixed>more ufoo.h
    #include <stdio.h>
    class UnmanagedFoo
    {
    public:
        UnmanagedFoo() {printf("Constructing UnmanagedFoo\n");}
        ~UnmanagedFoo() {printf("Destructing UnmanagedFoo\n");}
       void ShowYourself();
    };

    And implementation:

    E:\sample\vc\mixed>more ufoo.cpp
    #include "ufoo.h"
    void UnmanagedFoo::ShowYourself()
    {
        printf("UnmanagedFoo\n");
    }

    Another simple C++/CLI class ManagedFoo, with a member of UnmanagedFoo.

    E:\sample\vc\mixed>more mfoo.cpp
    #include "ufoo.h"
    #using <mscorlib.dll>
    using namespace System;

    ref class ManagedFoo
    {
    public:
        ManagedFoo()
        {
            Console::WriteLine("Constructing ManagedFoo");
            m_foo = new UnmanagedFoo();
            if (!m_foo) {
                throw gcnew OutOfMemoryException();
            }
        }
        ~ManagedFoo() {ShowDestruction();}
        !ManagedFoo() {ShowDestruction();}
        void ShowYourself()
        {
            Console::WriteLine("ManagedFoo");
            m_foo->ShowYourself();
        }
    private:
        void ShowDestruction()
        {
            if (m_foo) {
                delete m_foo;
            }

            Console::WriteLine("Destructing ManagedFoo");
        }
        UnmanagedFoo *m_foo;
    };

    C# class Bar uses ManagedFoo:

    E:\sample\vc\mixed>more bar.cs
    using System;
    class Bar
    {
        public static void Main()
        {
            ManagedFoo foo = new ManagedFoo();
            foo.ShowYourself();
        }
    }

    Let us build the project.

    First, compile ufoo.cpp into (unmanaged) obj file.

    E:\sample\vc\mixed>cl.exe /Zi /MD /c ufoo.cpp
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    Copyright (C) Microsoft Corporation. All rights reserved.

    ufoo.cpp

    And mfoo.cpp

    E:\sample\vc\mixed>cl.exe /Zi /clr /c mfoo.cpp
    Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.42
    for Microsoft (R) .NET Framework version 2.00.50727.88
    Copyright (C) Microsoft Corporation. All rights reserved.

    mfoo.cpp

    And bar.cs, referencing mfoo.obj

    E:\sample\vc\mixed>csc /target:module /addmodule:mfoo.obj bar.cs
    Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.88
    for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
    Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

    Finally, let’s link everything together.

    E:\sample\vc\mixed>link mfoo.obj ufoo.obj bar.netmodule /entry:Bar.Main /out:test.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    Now we have a single file assembly test.exe, mixed with unmanaged C++, C++/CLI, and C#.

    E:\sample\vc\mixed>test
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo

    We can also put ufoo.obj into a lib and link the lib in the final step, instead of using ufoo.obj directly.

    E:\sample\vc\mixed>lib ufoo.obj /out:ufoo.lib
    Microsoft (R) Library Manager Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    E:\sample\vc\mixed>link mfoo.obj ufoo.lib bar.netmodule /entry:Bar.Main /out:test2.exe /subsystem:console /ltcg
    Microsoft (R) Incremental Linker Version 8.00.50727.42
    Copyright (C) Microsoft Corporation. All rights reserved.

    Generating code
    Finished generating code

    E:\sample\vc\mixed>test2
    Constructing ManagedFoo
    Constructing UnmanagedFoo
    ManagedFoo
    UnmanagedFoo
    Destructing UnmanagedFoo
    Destructing ManagedFoo
     

  • 相关阅读:
    夯实JavaScript基础之prototype, __proto__, instanceof
    入住博客园
    基础知识盲点——2
    Vuecli开发笔记三引入外部插件
    转让阿里云服务器(CPU2G+内存2G+带宽5M+硬盘150G)
    ubuntu 1
    ftp命令
    mysql数据库备份及恢复命令mysqldump,source的用法
    wordpress option的操作
    wordpress作者角色添加不了视频代码
  • 原文地址:https://www.cnblogs.com/taoxu0903/p/1772892.html
Copyright © 2011-2022 走看看