2014-12-31 5 views
1

У меня есть очень простой C++ библиотека классов, которая имеет два типа учетных записей в нем под названием Проверки и Savings. Я построил этот проект и скомпилировал его в .dll под названием Accounts. Я ссылаюсь на Accounts.dll в моем приложении C# Console. Для того, чтобы не дали никаких результатов, я пытаюсь использовать статические классы депозита и изъятию из Savings и Проверки классов соответственно. Я не вижу, чтобы функции отображались в обозревателе объектов или Intellisense, и я не могу его построить, когда пытаюсь получить доступ к этим функциям, иначе я смогу создавать и запускать, когда комментирую вызов mySavings.deposit (arg1, arg2) ...Reference C++/CLI библиотеки классов (составитель DLL) в # проекте C

Любая идея, что я делаю неправильно здесь? Я часто ссылаюсь на .dlls из других проектов и третьих сторон, но это первый раз, ссылаясь на C++ .dll в проекте C#.

Класс C++ библиотека

#pragma once 
using namespace System; 

namespace Accounts { 

    public ref class Savings 
    { 
    public: 
     unsigned accountNumber; 
     double balance; 
     static double deposit(Savings s, double amount) 
     { 
      s.balance += amount; 
      return s.balance; 
     } 
    }; 

    public ref class Checking 
    { 
    public: 
     unsigned accountNumber; 
     double balance; 
     static double withdraw(Checking c, double amount) 
     { 
      c.balance -= amount; 
      return c.balance; 
     } 
    }; 
} 
Применение

C# Console, который ссылается на ранее скомпилированный динамическую библиотеку

using Accounts; 

class Program 
{ 
    static void Main(string[] args) 
    { 
    Savings mySavings = new Savings(); // works but object is empty 
    mySavings.deposit(mySavings, 100); // still breaks 
    } 
} 

я получаю следующее сообщение об ошибке: 'Accounts.Savings' не содержит определения для «депозит» и не может быть найден «депозит» метода расширения, принимающий первый аргумент типа «Accounts.Savings» (вам не хватает директивы использования или ссылки на сборку?)

Любая помощь будет принята с благодарностью.

ответ

2

Вы думаете, что C# может получить доступ к классам C++ ... это невозможно. Но C++/CLI может создавать типы .NET, которые C# может использовать. Однако они следуют правилам .NET, которые иногда отличаются от C++.

Во-первых, вы должны использовать ref class (или ref struct или value class или value struct) в вашем C коде ++/CLI:

public ref class Savings 

Затем вам необходимо инициализировать C# ссылка, чтобы указать на объект. Просто объявить переменную в C# недостаточно, чтобы получить построенный по умолчанию объект (не для ссылочных типов, где переменная будет null или неинициализирована, а не для типов значений, где контент будет полностью нулевым или неинициализированным, без конструктора называется).

Savings mySavings = new Savings(); 

После этого, вы обнаружите, что C++/CLI не может ссылаться на эталонные .NET типов, за исключением с помощью слежения за ручки ...поэтому вместо

Savings& 

вам нужно

Savings% // tracking reference, but C# doesn't know what to do 
     // with a function whose parameter is like this 

или

Savings^ // tracking pointer, C# likes it fine, C++/CLI will need -> to access members 

Наконец, синтаксис вызова статической функции из C# является

Savings.deposit(mySavings, 100); 
// ^^ class name, not object 

Но это, вероятно, следует быть нестационарным членом a yway, правильно ?.

+0

Хорошо, Бен, это помогло. Теперь я могу видеть accountNumber и баланс, но я до сих пор не вижу свою функцию. Я должен был удалить & из класса, чтобы получить его для компиляции, но мне не хватает всего, что позволит просматривать функции ... Я обновил свой код выше. – user2146538

+0

@ user2146538: Для использования аргумента функции и '->' вам нужна 'Savings ^' при ее использовании. Это потому, что переменные C#, как и в Java, на самом деле являются указателями. (Только для ссылочных типов, но типы значений не должны использоваться, когда есть инварианты, только для простых контейнеров данных) –

+0

Спасибо за объяснение. Никогда не видел ничего подобного! :-) – user2146538

Смежные вопросы