Access C# method from a C++ project located in the same solution

Madi Abdou Ramanou 1 Reputation point
2021-08-02T00:25:30.33+00:00

Hi,
I am building a solution that contains two projects (one is C# class library and one other a C++ static library). I added the C# project to the C++ project as reference and also i checked the register as interop COM and make Assembly COM-Visible checkbox in C# project. But i ca't see the neither namespace nor the class or methods of C# project in the C++ project.

Please help me

C++
C++
A high-level, general-purpose programming language, created as an extension of the C programming language, that has object-oriented, generic, and functional features in addition to facilities for low-level memory manipulation.
3,782 questions
{count} votes

2 answers

Sort by: Most helpful
  1. Madi Abdou Ramanou 1 Reputation point
    2021-08-02T07:46:30.84+00:00

    C#

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Media.Imaging;
    using System.Runtime.InteropServices;
    using WIA;
    namespace MyLib1
    {
    public class MySharpClass1
    {
    const string wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";

        public static string convertBitmapToBase64(BitmapImage bi)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bi));
            encoder.Save(ms);
            byte[] bitmapdata = ms.ToArray();
            return Convert.ToBase64String(bitmapdata);
        }
    
        public static string convBmpToBase64Strings(Bitmap bmp, ImageFormat imageFormat)
        {
            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            byte[] imageBytes = stream.ToArray();
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
        void SharpScanDocument()
        {
            DeviceManager deviceManager;
            DeviceInfos devices;
            deviceManager = new DeviceManager();
            devices = deviceManager.DeviceInfos;
            DeviceInfo selectedDevice;
            Device ourdevice;
            int selectedScanIndex = 0;
            string base64String = "";
            for (int i = 1; i <= devices.Count; i++)
            {
                DeviceInfo device;
                device = devices[i];
                if (device.Type == WiaDeviceType.ScannerDeviceType)
                {
                    selectedScanIndex = i;
                }
            }
            if (selectedScanIndex > 0)
            {
                selectedDevice = devices[selectedScanIndex];
                ourdevice = selectedDevice.Connect();
                Items items;
    
                items = ourdevice.Items;
                WIA.Item item = ourdevice.Items[1] as WIA.Item;
                WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
                WIA.ImageFile img = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false);
                byte[] buffer = (byte[])img.FileData.get_BinaryData();
                MemoryStream ms = new MemoryStream(buffer);
                Bitmap bmp = new Bitmap(Image.FromStream(ms));
                base64String = convBmpToBase64Strings(bmp, bmp.RawFormat);
    
            }
            Console.WriteLine($"Scan done");
            Console.ReadLine();
        }
    }
    

    }

    C++

    include "pch.h"

    include "CppLib1.h"

    namespace MyCppSpace {
    class CppLib1 {
    void testSharpCall() {
    MyLib1::MySharpClass1::SharpScanDocument();
    }
    };
    }


  2. Jeanine Zhang-MSFT 9,946 Reputation points Microsoft Vendor
    2021-08-03T08:01:44.12+00:00

    Hi,

    But i ca't see the neither namespace nor the class or methods of C# project in the C++ project.

    I suggest you could refer to the answer:

    COM itself does not have a concept of namespace (which is language-specific).

    RegAsm.exe uses the assembly name as the name of the library statement in the IDL. It does not care which namespace your COMVisible class is in.

    By default the C++ compiler imports a type library into a namespace with its name specified by the library statement in the IDL. Use the assembly name as the namespace name (or rename the namespace in the import statement) in your C++ code.

    If you want to use COM. As far as I'm concerned you should make your C# class exposed to COM and then you can use it in C++. For more details I suggest you could refer to the thread: https://stackoverflow.com/a/29988737/11872808

    Best Regards,

    Jeanine


    If the response is helpful, please click "Accept Answer" and upvote it.

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.