Управляемый C ++ Wrapper для неуправляемой статической библиотеки с зависаниями статических переменных - PullRequest
0 голосов
/ 27 октября 2010

Объяснение проблемы немного сложное, пожалуйста, потерпите меня.

У меня есть неуправляемая статическая библиотека C ++, которая используется для финансового приложения.Он имеет соглашения о рабочих днях, соглашения о свопах, соглашения о связях и т. Д. Большинство соглашений основаны на статических глобальных переменных, которые инициализируются при первом использовании.Библиотека также инициализирует праздничные календари при запуске, выполняя некоторые запросы к базе данных SQL Server с использованием ODBC.

Мне приходится взаимодействовать со сторонним программным обеспечением с помощью веб-служб.Единственный способ сделать это реально через C #.Это не проблема, и я добился хорошего прогресса.Однако я наткнулся на камень преткновения, когда возникла необходимость провести некоторые вычисления даты в C #.Поскольку я не хотел переносить весь свой код C ++ на C #, я подумал, что наиболее эффективным способом достижения этого было бы написание библиотеки DLL библиотеки управляемых классов C ++, которая является оболочкой для моей неуправляемой статической библиотеки.Кажется, все работает нормально, я не получаю ошибок во время компиляции или во время компоновки, и я могу добавить ссылку на обертку и увидеть все правильные определения объектов.Однако, когда я пытаюсь запустить мое приложение, оно просто зависает.Я попытался поиграть с кучей настроек компилятора для DLL-оболочки, но безрезультатно.Если я удаляю зависимость проекта от моей неуправляемой библиотеки, все работает нормально.У меня есть сильное подозрение, что мое либеральное использование глобальных статических переменных вызывает проблемы.Есть ли способ решить эту проблему, хотя бы выясните, где проблема?Пример кода приведен ниже.

Спасибо, Марк.

// FSAManaged.h

#pragma once

using namespace System;

//class XLDate;

namespace FSAManaged {
 public ref class Futures
 {
 public:
  static DateTime Expiry(String ^ code, DateTime date);
 };
}

Реализация даже не зависит от зависимости от неуправляемой статической библиотеки:

// This is the main DLL file.
#include "stdafx.h"
#include "FSAManaged.h"


namespace FSAManaged
{
 DateTime Futures::Expiry(String ^ code, DateTime date) {
  return DateTime::Today;
 }
}

Для полнотыРади, вот AssemblyInfo.cpp:

#include "stdafx.h"

using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;

//
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
//
[assembly:AssemblyTitleAttribute("FSAManaged")];
[assembly:AssemblyDescriptionAttribute("")];
[assembly:AssemblyConfigurationAttribute("")];
[assembly:AssemblyCompanyAttribute("?????")];
[assembly:AssemblyProductAttribute("FSAManaged")];
[assembly:AssemblyCopyrightAttribute("??????")];
[assembly:AssemblyTrademarkAttribute("")];
[assembly:AssemblyCultureAttribute("")];

//
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the value or you can default the Revision and Build Numbers
// by using the '*' as shown below:

[assembly:AssemblyVersionAttribute("1.0.*")];

[assembly:ComVisible(false)];

[assembly:CLSCompliantAttribute(true)];

[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Используйте отладчик. Если вы тестируете это из C #, тогда Project + Properties, Debug, отметьте «Enabled unmanaged code debugging» Настоятельно рекомендуется настроить сервер символов в меню Инструменты + Параметры, Отладка, Символы. Run.

Когда он зависает, используйте Debug + Break All. Отладка + Windows + Threads и дважды щелкните по потоку, который должен выполнять эту работу. Отладка + Windows + Вызов стека, чтобы увидеть, что происходит. Опубликуйте трассировку стека в своем вопросе, если не можете разобраться. Все, что вы видите в окне «Вывод» и в строке состояния Visual Studio, также имеет значение.

0 голосов
/ 27 октября 2010

Статические переменные C ++ инициализируются из DllMain.Есть много вещей, которые вы не должны делать в DllMain;запуск загрузки еще одного Dll, являющегося наиболее важным.Это легко сломать, если вы заходите в библиотеки других людей из DllMain.

Я предлагаю вам сделать функцию Init на вашей Dll, которую вы вызываете после запуска dll

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...