C#调用一个c++写的dll,需要在调用前初始化com库(因为这个dll中用到了com对象),
在c++可使用CoInitializeEx初始化,但在c#中调用CoInitializeEx似乎不可以,代码如下:
static void Main()
{
AutoCAD.CoInitializeEx((System.IntPtr)null, CoInit.MultiThreaded);
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new SignatureService()
};
ServiceBase.Run(ServicesToRun);
AutoCAD.CoUninitialize();
} namespace SignatureService
{
public enum CoInit
{
MultiThreaded = 0x0,
ApartmentThreaded = 0x2,
DisableOLE1DDE = 0x4,
SpeedOverMemory = 0x8
}
[DllImport("Ole32.dll", ExactSpelling = true, EntryPoint = "CoInitializeEx",
CallingConvention = CallingConvention.StdCall, SetLastError = false, PreserveSig = false)]
public static extern void CoInitializeEx(IntPtr pvReserved, CoInit coInit); [DllImport("ole32.dll")]
public static extern int CoUninitialize();
}
}
程序可以运行,但使用到dll中的com对象时,有异常,应该是com库未正常初始化引起。请问1.clr会初始化com库,是否是这样吗?
2.clr初始化com库与CoInitializeEx初始化的是否有区别?3.能不能屏蔽clr初始化com库,由我自己初始化。对C#不是很了解,请各路大侠指教,不胜感激。
在c++可使用CoInitializeEx初始化,但在c#中调用CoInitializeEx似乎不可以,代码如下:
static void Main()
{
AutoCAD.CoInitializeEx((System.IntPtr)null, CoInit.MultiThreaded);
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new SignatureService()
};
ServiceBase.Run(ServicesToRun);
AutoCAD.CoUninitialize();
} namespace SignatureService
{
public enum CoInit
{
MultiThreaded = 0x0,
ApartmentThreaded = 0x2,
DisableOLE1DDE = 0x4,
SpeedOverMemory = 0x8
}
[DllImport("Ole32.dll", ExactSpelling = true, EntryPoint = "CoInitializeEx",
CallingConvention = CallingConvention.StdCall, SetLastError = false, PreserveSig = false)]
public static extern void CoInitializeEx(IntPtr pvReserved, CoInit coInit); [DllImport("ole32.dll")]
public static extern int CoUninitialize();
}
}
程序可以运行,但使用到dll中的com对象时,有异常,应该是com库未正常初始化引起。请问1.clr会初始化com库,是否是这样吗?
2.clr初始化com库与CoInitializeEx初始化的是否有区别?3.能不能屏蔽clr初始化com库,由我自己初始化。对C#不是很了解,请各路大侠指教,不胜感激。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货