Tag: interop

从c#创建Win32事件

我想从C#创建一个内核(也称为命名事件)。 我是否必须互操作服务并包装本机CreateEvent函数,或者是否已经有一个.NET类来完成这项工作? 我需要运行的函数应该是这样的:hEvent = CreateEvent(NULL,false,false,“MyCSHARPEvent”); 这应该通知所有探测器,探测有关该事件的MyCSHARPEvent。 如果需要包装函数,我如何将SECURITY_ATTRIBUTES结构从C#转换为win32?

C# – 挂钩到现有的COM对象

假设我们有一个现有的进程(或应用程序)从ocx文件调用COM对象,例如“MyCOMLibrary.ocx”。 有没有办法编写一个C#库来完全复制ocx文件? 这样原始应用程序可以调用您的C#代码而不是原始COM对象? 当然,您必须使用相同的CLSID和ProgID作为原始ocx。 假设没有涉及签名,例如.Net世界中的SNK。 此外,是否有任何工具可以实现自动化? 接受ocx的东西并使用要实现的方法吐出C#文件。 编辑:我想补充说原始应用程序是VB6,并且根本不使用.Net。 他们最有可能将ocx加载为VB6 app(ProgId或Guid)。 这会导致任何问题吗? 完全重写ocx我们也没有问题 – 我们很可能只返回所有方法的成功错误代码,并且只使用我们的情况所需的方法/事件。 编辑:你会认为这不会太难实现。 我们可以创建一个可以替换旧ocx的VB6 ocx文件,并将所有调用传递给.Net程序集吗? 编辑:我尝试使用以下开源库: EasyHook 但似乎这个问题应该仍然可行。 VB6似乎以防止挂钩的方式加载COM对象。 我没有看到使用EasyHook在类/接口或类的构造函数上挂钩实例方法的方法。

C#中的struct marshal

我在C#中有以下结构 unsafe public struct control { public int bSetComPort; public int iComPortIndex; public int iBaudRate; public int iManufactoryID; public byte btAddressOfCamera; public int iCameraParam; public byte PresetNum; public byte PresetWaitTime; public byte Group; public byte AutoCruiseStatus; public byte Channel; public fixed byte Data[64]; } 我用来将它转换为字节数组[]的函数是 static byte[] structtobyte(object obj) { int len = Marshal.SizeOf(obj); byte[] […]

从内存运行可执行文件

我正在尝试直接从此可执行文件的byte []表示中运行可执行文件作为C#中的资源。 所以基本上我想直接运行PE的byte []而不需要触摸硬盘。 我正在使用的代码曾经用于工作但它不再存在。 代码创建一个具有冻结主线程的进程,更改整个进程数据并最终恢复它,以便它运行PE的byte []。 但是如果线程恢复,似乎进程就会死掉,我真的不知道什么是错的。 所以这里是一个pastebin中的代码,因为它太长了我猜… http://pastebin.com/18hfFvHm 编辑: 我想运行非托管代码! 任何PE文件……

如何在inheritance自另一个COM接口的C#上声明和实现COM接口?

我试图了解从C#代码实现COM接口的正确原因是什么。 当接口不从其他基接口inheritance时,它很简单。 像这个: [ComImport, Guid(“2047E320-F2A9-11CE-AE65-08002B2E1262”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IShellFolderViewCB { long MessageSFVCB(uint uMsg, int wParam, int lParam); } 然而,当我需要实现从其他COM接口inheritance的接口时,事情开始变得疲惫不堪。 例如,如果我实现inheritance自IPersistFolder的IPersistFolder2接口,它通常依赖于C#代码从IPersistFolderinheritance: [ComImport, Guid(“0000010c-0000-0000-C000-000000000046”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersist { void GetClassID([Out] out Guid classID); } [ComImport, Guid(“000214EA-0000-0000-C000-000000000046”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistFolder : IPersist { void Initialize([In] IntPtr pidl); } [ComImport, Guid(“1AC3D9F0-175C-11d1-95BE-00609797EA4F”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistFolder2 : IPersistFolder […]

COM互操作是否尊重.NET AppDomain边界以进行程序集加载?

这是核心问题:我有一个在单独的AppDomain中使用COM互操作的.NET应用程序。 COM的东西似乎是将程序集加载回默认域,而不是从中调用COM内容的AppDomain。 我想知道的是:这是预期的行为,还是我做错了导致这些COM相关的程序集被加载到错误的AppDomain中? 请参阅以下情况的更详细说明…… 该应用程序由3个程序集组成: – 主EXE,应用程序的入口点。 – common.dll,只包含一个接口IController(采用IPlugin风格) – controller.dll,包含一个实现IController和MarshalByRefObject的Controller类。 此类完成所有工作并使用COM interop与另一个应用程序进行交互。 主要EXE的相关部分如下所示: AppDomain controller_domain = AppDomain.CreateDomain(“Controller Domain”); IController c = (IController)controller_domain.CreateInstanceFromAndUnwrap(“controller.dll”, “MyNamespace.Controller”); result = c.Run(); AppDomain.Unload(controller_domain); common.dll只包含以下两件事: public enum ControllerRunResult{FatalError, Finished, NonFatalError, NotRun} public interface IController { ControllerRunResult Run(); } controller.dll包含这个类(也调用COM互操作的东西): public class Controller: IController, MarshalByRefObject 首次运行应用程序时,Assembly.GetAssemblies()看起来像预期的那样,在两个AppDomain中都加载了common.dll,并且只将controller.dll加载到控制器域中。 在调用c.Run()之后,我看到与COM互操作相关的程序集已加载到默认的AppDomain中,而不是在发生COM互操作的AppDomain中。 为什么会发生这种情况? 如果你有兴趣,这里有一些背景知识: 最初这是一个1 AppDomain应用程序。 它与之接口的COM东西是一个服务器API,在长时间使用时不稳定。 […]

如何在本机.NET类中包装COM对象?

我在.NET(C#)中使用了广泛的现有COM API(可能是Outlook,但它不是)。 我已经通过在Visual Studio中添加“COM Reference”来完成此操作,因此所有“魔法”都是在幕后完成的(即,我不必手动运行tlbimp )。 虽然现在可以从.NET“轻松”使用COM API,但它不是非常友好的.NET。 例如,没有generics,事件很奇怪,像IPicture等奇怪。所以,我想创建一个使用现有COM API实现的本机.NET API。 一个简单的第一次传球可能是 namespace Company.Product { class ComObject { public readonly global::Product.ComObject Handle; // the “native” COM object public ComObject(global::Product.ComObject handle) { if (handle == null) throw new ArgumentNullException(“handle”); Handle = handle; } // EDIT: suggestions from nobugz public override int GetHashCode() { return Handle.GetHashCode(); } […]

将C ++字符串发送到C#字符串。 互操作

我是跨流程沟通的新手,需要一些帮助。 我希望能够将C ++程序中的字符串发送到C#程序。 我的问题是结果字符串是乱码。 这是我的代码: 发送程序(C ++): void transmitState(char* myStr) { HWND hWnd = ::FindWindow(NULL, _T(“myApp v.1.0”)); if (hWnd) { COPYDATASTRUCT cds; ::ZeroMemory(&cds, sizeof(COPYDATASTRUCT)); cds.dwData = 0; cds.lpData = (PVOID) myStr; cds.cbData = strlen(myStr) + 1; ::SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds); } } 接收程序(C#)(我已经覆盖了WndProc): private void OnCopyData(ref Message m) { COPYDATASTRUCT cds = new COPYDATASTRUCT(); cds […]

C#/ IronPython与共享C#类库互操作

我正在尝试使用IronPython作为C#GUI和一些C#库之间的中介,以便它可以在编译后编写脚本。 我有一个类库DLL,由GUI和python使用,是这样的: namespace MyLib { public class MyClass { public string Name { get; set; } public MyClass(string name) { this.Name = name; } } } IronPython代码如下: import clr clr.AddReferenceToFile(r”MyLib.dll”) from MyLib import MyClass ReturnObject = MyClass(“Test”) 然后,在C#中我将其称为如下: ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = null; scope = engine.CreateScope(); ScriptSource source = engine.CreateScriptSourceFromFile(“Script.py”); source.Execute(scope); MyClass […]

注册C#COM对象而没有RegAsm的真实文件

我有一个奇怪的应用程序加载机制。 我有一个boostrapping exe文件,包含所有其他DLL和应用程序本身的资源。 这些文件(程序集)是从资源中提取并加载的,因为我附加到当前AppDomain的Assemblyresolve事件。 [STAThread] static void Main() { // if the command line contains extract then extract the dlls, next run will resolve assemblies from disk bool saveDllsToDisk = new List(Environment.GetCommandLineArgs()).Contains(“extract”); // if the command line contains bin then use the bin folder instead of temp to extract dlls bool useBinFolder = new List(Environment.GetCommandLineArgs()).Contains(“bin”); […]