У меня есть dll С#, которую мне нужно вызвать из неуправляемого С++. Основная проблема, с которой я столкнулся, заключается в том, что мой код C++ соответствует надстройке Excel, которую можно установить для Excel 2003 и Excel 2007, когда я устанавливаю свою надстройку в Excel 2007 и пытаюсь вызвать свою C# dll, он работает просто отлично, но по какой-то причине, которую я до сих пор не смог найти, в excel 2003 происходит сбой, excel показывает мне сообщение об ошибке выполнения, и при отладке моего кода на С++ я вижу, что код терпит неудачу при попытке создайте экземпляр моей dll С#, он говорит, что класс не зарегистрирован, даже если я зарегистрировался с помощью regasm.
это мой код С#:
namespace ManagedDLL
{
[
Guid("3C80EE60-D9B8-4daf-89BE-6C7B748F613C"),
InterfaceType( ComInterfaceType.InterfaceIsDual),
ComVisible(true)
]
public interface ICalculator
{
[DispId(1)]
int main(string args, IntPtr _handle);
};
[
Guid("5134F342-5B7F-4db2-94F0-F450610419CF"),
ProgId("myapp.CCOMEntryPoint"),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(ICalculator)),
ComVisible(true)
]
public class COMEntryPoint : ICalculator
{
public int main(string args, IntPtr _handle)
{
string[] _args = args.Split(new char[] { ':' });
Program.handle = _handle;
return Program.Main(_args);
}
}
}
а в С++ я импортирую файл .tlb, который создается, когда я использую regasm для регистрации моей dll C#, например:
\#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
.
.
.
int callMyDll()
{
long handle = 0, result = 0;
BSTR args;
HRESULT hr = CoInitialize(NULL);
ICalculatorPtr pICalc(__uuidof(COMEntryPoint));
pICalc->main(bstrStr, handle, &result);
return result;
}
Но, как я уже упоминал ранее, этот код не работает для Excel 2003, поэтому мои вопросы:
- Я делаю что-то неправильно в том, как я объявляю свою dll С#, которая вызывает у меня проблемы в excel 2003?
- Как и сейчас, может ли моя C# dll считаться объектом ActiveX?
- Как я могу назвать свою dll С# по-другому из С++? например, с помощью IDIspatch
Спасибо