Объяснение проблемы немного сложное, пожалуйста, потерпите меня.
У меня есть неуправляемая статическая библиотека 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)];