在没有RegAsm的真实文件共享的情况下注册C#COM对象我有一个奇怪的应用程序加载机制。我有一个boostrappingexe,其中包含应用程序本身的所有其他DLL和资源。这些文件(程序集)是从资源中获取并加载的,因为我附加到当前AppDomain的Assemblyresolve事件。[STAThread]staticvoidMain(){//如果命令行包含提取,则提取dll,下次运行将从磁盘解析程序集boolsaveDllsToDisk=newList(Environment.GetCommandLineArgs()).Contains("extract");//如果命令行包含bin然后使用bin文件夹而不是temp来提取dllbooluseBinFolder=newList(Environment.GetCommandLineArgs()).Contains("bin");如果(!Directory.Exists(tempFolder)){Directory.CreateDirectory(tempFolder);}//程序集解析器将到达此处,因为它不会在bin文件夹中找到dll//我们以特定方式加载程序集://-如果存在于我们的temp/bin文件夹中,则从那里加载//-否则从中加载资源//-如果指定将DLL提取到临时/bin文件夹AppDomain.CurrentDomain.AssemblyResolve+=(sender,args2)=>{stringname=newAssemblyName(args2.Name).Name;Debug.WriteLine("开始加载"+名称);程序集程序集=null;字符串文件夹=useBinFolder?binFolder:Path.Combine(tempFolder,APP_NAME);stringfileName=name.Replace(".","_").Replace("#EXE#","");//在资源中我们使用_而不是.字符串扩展名=name.Contains("#EXE#")?“exe”:“dll”;//破解我们的嵌入式exe文件name=name.Replace("#EXE#","");//破解我们的嵌入式exe文件if(File.Exists(Path.Combine(folder,String.Format("{0}.{1}",name,extension)))){//从应用临时文件加载文件夹程序集=Assembly.LoadFile(Path.Combine(文件夹,String.Format("{0}.{1}",名称,扩展名)));}else{//从资源中提取程序集byte[]assemblyBytes=(byte[])resMan.GetObject(fileName,CultureInfo.InvariantCulture);assembly=Assembly.Load(assemblyBytes);//如果选择保存到文件,那么下一次运行JIT将从磁盘解析if(saveDllsToDisk){stringoutDll=Path.Combine(folder,String.Format("{0}.{1}",name,extension));使用(varfs=File.Create(outDll)){fs.Write(assemblyBytes,0,assemblyBytes.Length);}}}Debug.WriteLine("LOADED"+name);返回组件;};splashScreen=newfrmSplash();//一旦splashscreen开始动画程序集预加载将在此事件处理程序上启动splashScreen.Started+=newEventHandler(splash_Started);//splashscreen已经完成fadein我们现在必须等待所有库被预加载并设置CanContinuesplashScreen.Finishing+=newEventHandler(splash_Finishing);splashScreen.CanContinue=false;//在Application.Run(splashScreen)运行时运行D预加载启动画面;这个引导程序只有一个引用,即主应用程序,但它没有在main方法中引用它,以避免在开始时进行程序集搜索我所做的是在启动画面动画期间强制assembly:ObjectHandleinstance;string[,]assemblies={{"WindowsBase,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35","dummy"},//将来自GAC,而不是我们的解析器{"PresentationCore,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35","dummy"},//将来自GAC,而不是我们的解析器{"PresentationFramework,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35","dummy"},//将来自GAC,而不是我们的解析器{"WindowsFormsIntegration,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35","dummy"},//将来自GAC,而不是我们的解析器{"PresentationFramework.Aero,Version=3.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35","dummy"},//将来自GAC,而不是我们的解析器{"System.Core,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089","dummy"},//将来自GAC,而不是我们的解析器{"AvalonDock,Version=1.3.3585.0,Culture=neutral,PublicKeyToken=85a1e0ada7ec13e4","dummy"},//资源内部引用{"AvalonDock.Themes,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null","dummy"},//资源内部引用{"ICSharpCode.AvalonEdit,Version=4.0.0.5950,Culture=neutral,PublicKeyToken=9cc39be672370310","dummy"},//outreferenceinsideresources{"WPG,Version=2.0.4120.37542,Culture=neutral,PublicKeyToken=null","dummy"},//资源内部引用{"WPGBrushEditor,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null","dummy"},//资源内部引用{"HLSLEditor,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null","dummy"}//甚至预加载将在启动画面后启动的主文件};for(inti=0;i<=assemblies.GetUpperBound(0);i++){try{instance=AppDomain.CurrentDomain.CreateInstance(assemblies[i,0],assemblies[i,1]);}catch(Exceptionex){/*不能引发错误,它会失败,因为我们实际上并没有询问对于*有效类型,我们现在只需要加载此程序集*/}}现在您在任何文件夹中都看不到实际的dll文件,而是直接从资源加载程序集我现在的问题是:如何在.dll文件?RegAsm使用文件路径注册COM对象...?任何帮助表示赞赏!我在Excel-DNA中做了非常相似的事情。您不必将COM类型反序列化到磁盘,或提前注册它们。我所做的是定义一个实现IClassFactory的类,然后通过调用CoRegisterClassObject将其注册为特定CLSID(类型)的当前类工厂。当COM尝试创建对象时,将调用类工厂并返回.NET类型的实例。根据上下文,您可能必须动态处理ProgID/CLSID注册。(如果您与我联系,我将很乐意帮助您从Excel-DNA代码中获取正确的位以帮助您入门。)我仔细研究了一下,也许将DllRegisterServer()实现到他的主要可执行文件中,并注册所有嵌入式DLL中的所有COM类型都可以工作...任何人都可以确认吗?编辑:是的,它可以完成,但主要可执行文件必须是DLL内的COM代理。以上就是《C#学习教程:RegisteringC#COMObjectswithoutRegAsm'srealfilesharing》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: